Skip to content
minichao9901 edited this page Mar 1, 2024 · 64 revisions

如何快速生成例化模板

xilinx::designutils::write_template -template -verilog

verilog代码中增加debug_mark语句(一般放在接口定义前面)

(*mark_debug="true"*)

xsct的一些命令

connect
ta     //list all targets
ta 2   //选择targets 2
help
help ta
jtagterminal -start
mrd 0x00000000 4
mwr 0x50 0x11223344
mrd 0x50
help mwr   //关于写的更多用法
help mrd   //关于读的更多用法

rrd     //读取cpu寄存器组
rrd mpcore   //可以看到所有的cpu内部外设寄存器
rwr     //写cpu寄存器组

rst    //复位

bpadd  //添加断点
bpaddr -addr 0x1000000
bpadd -addr &main
bpadd -file main.c -line 23
bpadd -addr &fooVar -type hw -mode 0x3
nxt    //到达breakpoint后,会停止。输入nxt执行下一行
nxt 10000  //往下执行10000行。输入一个很大的值,目的是让其达到下一个breakpoint

在xsct中bpadd添加断点后,再烧录程序,它会在断点的地方停下来。这个时候可以用rrd/mrd观察寄存器组或内存的信息。输入nxt 10000,让其继续跑下去。

寄存器操作函数(xil_io.h)

#include "xil_io.h"

u8 Xil_In8(UINTPTR Addr)
u16 Xil_In16(UINTPTR Addr)
u32 Xil_In32(UINTPTR Addr)
u64 Xil_In64(UINTPTR Addr)

void Xil_Out8(UINTPTR Addr, u8 Value)
void Xil_Out16(UINTPTR Addr, u16 Value)
void Xil_Out32(UINTPTR Addr, u32 Value)
void Xil_Out64(UINTPTR Addr, u64 Value)

Cache操作函数

DDR访问,一般会关闭Dcache

#include "xil_cache.h"

Xil_ICacheDisable();
Xil_DCacheDisable();
Xil_DCacheFlush();
 Xil_DCacheFlushRange((u32)rx_buffer, BUFF_LEN*4);

测量延时的函数

#include "xtime_l.h"

XTime_SetTime(0);
XTime t1,t2;
function1();
XTime_GetTime(&t1);
function2();
XTime_GetTime(&t2);

XTime dt1 = ((t1) * 1000000) / (COUNTS_PER_SECOND);
XTime dt2 = ((t2-t1) * 1000000) / (COUNTS_PER_SECOND);
xil_printf("dt1=%f, dt2=%f\r\n", dt1,dt2);

工作计划

  • 15211功耗数据
  • 15211问题跟踪列表分析
  • 孙工布置的仿真tb及路径规范
  • 15231新的方案面积评估

研究计划:

  • 研究串口加fifo:1周
  • 完成原子mb例程(还有2个):1周
  • 完成z7nano ADC_DAC例程的进一步学习研究:1周
  • 完成原子的剩余例程的学习:2周
  • 安装openocd,研究一下:1周
  • 学习小梅哥的视频:一个月
  • 大道至简的书:2个月

  • new3 去掉local memory。目标是验证,去掉local memory之后,mb程序是否可以直接在ddr或local memory中运行?
  • new3_1 基于new3,并参考了xilinx的doc,已经搞定了。最核心的其实是手动修改mb的ld文件,让vector和reset位于ddr区域。
  • new4 去掉dp接口,通过dc接口接axi_gpio/axi_uartlite。目标是验证,不用dp接口,用dc接口是否可以读写外设?(不可以)
  • new5 增加对HP0_DDR_LOWOCM的总线地址访问。目标是寻找为什么ocm_higher_addr不能访问?
  • new6 增加对HP0_DDR_LOWOCM的总线地址访问,并修改mb的cache地址范围为0x10000000--0x1fffffff。目标是寻找寻找为什么ocm_higher_addr不能访问?
  • new7 基于new6,换成GP0_DDR_LOWOCM访问
  • new8 基于new7,将HP0_HIGH_OCM换成GP0_LOW_OCM。这个时候,mb的Data全部都是GP0访问,没有HP0访问。发现这种情况所有ram都可以访问到,是最好的。
  • new9 去掉IC/DC接口,启动DP/IP接口,用DP/IP接口去访问外设和执行程序,看是否可以执行程序?(可以)

线性序列机模板

parameter CNT_MAX=50_000_000;
reg [31:0] div_cnt;
reg [5:0] lsm_cnt;

always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==0)
    div_cnt<=0;
else if(div_cnt==CNT_MAX-1)
    div_cnt<=0;
else
    div_cnt<=div_cnt+1;  
    
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==0)
    lsm_cnt<=0;
else if(div_cnt==CNT_MAX-1)
    lsm_cnt<=lsm_cnt+1;    

tb激励模板

`timescale 1ns / 1ps

module clk_rstn_gen(
    output sys_clk,
    output sys_rst_n
    );
    
reg sys_clk, sys_rst_n;
initial sys_clk=0;
always #10 sys_clk=~sys_clk;

initial begin
    sys_rst_n=0;
    #1000;
    sys_rst_n=1;
end 
    
endmodule 
`timescale 1ns / 1ps

module clk_rstn_gen(
    output sys_clk,
    output sys_rst_n1,
    output sys_rst_n2,
    output sys_rst_n3      
    );
    
reg sys_clk;
reg sys_rst_n1, sys_rst_n2, sys_rst_n3;
initial sys_clk=0;
always #10 sys_clk=~sys_clk;

initial begin
    sys_rst_n1=0;
    sys_rst_n2=0;
    sys_rst_n3=0;        
    #10000;
    sys_rst_n1=1;
    #10000;
    sys_rst_n2=1;
    #10000;
    sys_rst_n3=1;
end   
    
endmodule
Clone this wiki locally