[zynq] zynq7000开发流程之仿真TestBench
来源:互联网 发布:数据加密标准des 编辑:程序博客网 时间:2024/04/30 14:01
工具:vivado、notepad++ (设置成Encode in ANSI,确保中文不乱码)
目标:基本常用的TB激励,vivado提供的激励
一般TB结构都比较简单,module不需要外部接口信号。
1、先将被测DUT实例化,定义dut的接口变量。
a) 站在TB的角度,输出信号定义reg(即dut的输入信号),TB的输入信号定义wire(即dut的输出信号),inout接口必须定义成wire。
b) 设计中是外接bram模块的,这里用数组模拟ram,定义: reg [7:0] mem [0:8191]; ,大小8KB,后面即地址[addr]。
2、时钟、复位初始化
这里仿真单位都是1ns,时钟一直有,启动50ns后释放reset。
initial /* clock gen */beginclk = 0;forever #10 clk = ~clk;//20ns 50mhzendinitial /* reset gen */beginrst_n = 0;#50rst_n = 1;end
3、内存初始化:前面256字节存储从0到255,4400开头的地址存命令字。
integer i;initial /* ram memory data */begin//initial datafor(i=0; i<255; i=i+1)mem[i] = i;//head infomem[4400] = 8'h00; //CMD1mem[4401] = 8'h30; //CMD2mem[4402] = 8'h70; //70Hmem[4403] = 8'h00; //feedbackmem[4404] = 8'h0F; //ADDR1mem[4405] = 8'h00; //ADDR2mem[4406] = 8'h0F; //ADDR3mem[4407] = 8'h00; //ADDR4mem[4408] = 8'h0F; //NUM1mem[4409] = 8'h00; //NUM2end
4、下面这段TB代码的功能是从SRAM读出数据,经过用户RTL代码后,送入到nand flash里面。
sram和nand是TB需要描述模拟的器件。写命令、写地址、写数据、等待busy/ready,写70H命令回读写成功状态。
关注nand_we_n上升沿时配合信号和数据是否正确,以及nand_rb_n状态。
`timescale 1ns/1ns/****************************************** * * this module is just for write nand * ******************************************/module tb_controller();wire nand_cle ;wire nand_ale ;wire nand_we_n;wire nand_re_n;wire nand_ce_n;wire nand_wp_n;reg nand_rb_n; //busywire [7:0] nand_io ; //inoutwire ram_clk ;wire ram_en ;wire ram_we ;wire [12:0] ram_addr;wire [7:0] ram_din ;reg [7:0] ram_dout ;reg clk;reg rst_n;reg fulfil;wire accomplish;wire out_led;/****************************************** * * global signals * ******************************************/ initial /* clock gen */beginclk = 0;forever #10 clk = ~clk;//20ns 50mhzendinitial /* reset gen asyn */beginrst_n = 0;#50rst_n = 1;endinitial /* fulfil trigger -> */beginfulfil = 0;#100fulfil =1;end/****************************************** * * SRAM simulation * ******************************************/ reg [7:0] mem_ram [0:8191];integer addr_ram;initial /* ram mem_ramory data */begin//initial datafor(addr_ram=0; addr_ram<255; addr_ram=addr_ram+1)mem_ram[addr_ram] = addr_ram;//head infomem_ram[4400] = 8'h80; //CMD1mem_ram[4401] = 8'h10; //CMD2mem_ram[4402] = 8'h70; //70Hmem_ram[4403] = 8'h00; //feedbackmem_ram[4404] = 8'h0F; //ADDR1mem_ram[4405] = 8'h00; //ADDR2mem_ram[4406] = 8'h0F; //ADDR3mem_ram[4407] = 8'h00; //ADDR4mem_ram[4408] = 8'h0F; //NUM1mem_ram[4409] = 8'h00; //NUM2endalways @(posedge ram_clk)beginif(ram_we==0) //data outbeginram_dout <= mem_ram[ram_addr];endelsebeginram_dout <= 8'hzz;endend/****************************************** * 模块:NAND simulation * 数据存到文件或数组中 * 按接收顺序存 ******************************************/reg [7:0] mem_nand[0:4351];reg [12:0] addr_nd;reg ask_70H;initialbegin /* busy time */addr_nd = 12'b0;ask_70H = 0;end/* 上升沿写入数据 */always @(posedge nand_we_n)beginif(nand_ce_n==0 && nand_cle==1 && nand_ale==0)begin //cmd //也可以参数固定地址mem_nand[addr_nd] = nand_io;addr_nd = addr_nd + 1;endelse if(nand_ce_n==0 && nand_cle==0 && nand_ale==1)begin //addrmem_nand[addr_nd] = nand_io;addr_nd = addr_nd + 1;endelse if(nand_ce_n==0 && nand_re_n==1)begin //data inmem_nand[addr_nd] = nand_io;addr_nd = addr_nd + 1;endelse begin //wrong operation$display("%t\t pls check wrong state below:",$time);$display("\t nand_ce_n=%b,nand_cle=%b,nand_ale=%b,nand_we_n=%b,nand_re_n=%b",nand_ce_n,nand_cle,nand_ale,nand_we_n,nand_re_n);endendalways @(posedge nand_we_n) /* nand_r/b# */beginif(nand_ce_n==0 && nand_cle==1 && nand_ale==0 && nand_io==8'h10)beginnand_rb_n = 0;#500 //busy timenand_rb_n = 1;endelsebeginnand_rb_n = 1;endendalways @(posedge nand_we_n or negedge nand_re_n) /* 70H feedback */beginif(nand_ce_n==0 && nand_cle==1 && nand_ale==0 && nand_io==8'h70)beginask_70H = 1;endelse if(ask_70H==1 && nand_re_n==0)begin //70H后RE有效 反馈statusmem_nand[addr_nd] = 8'h55; //ask_70H = 0;endelsebegin//endendinitial /* monitor */begin$monitor("%t\t fulfil=%b", $time, fulfil);$monitor("%t\t nand_rb_n=%b", $time, nand_rb_n);end/****************************************** * * DUT instantiation * ******************************************/nand_controller dut(/* nand side */.nand_cle ( nand_cle ),.nand_ale ( nand_ale ),.nand_we_n ( nand_we_n),.nand_re_n ( nand_re_n),.nand_ce_n ( nand_ce_n),.nand_wp_n ( nand_wp_n),.nand_rb_n ( nand_rb_n),.nand_io ( nand_io ),/* ram <-> nand */.ram_clk ( ram_clk ),.ram_en ( ram_en ),.ram_we ( ram_we ),.ram_addr ( ram_addr),.ram_din ( ram_din ),.ram_dout ( ram_dout), /* global signals */.clk ( clk ),.rst_n ( rst_n ),.fulfil_ddr_ram ( fulfil ),.accomplish_nand ( accomplish),/* led: idle run err */.out_led ( out_led ));endmodule
0 0
- [zynq] zynq7000开发流程之仿真TestBench
- [zynq] zynq7000开发流程之Vivado Simulator仿真
- [zynq] zynq7000开发流程之Vivado操作
- [zynq] zynq7000开发流程之SDK操作
- [zynq] zynq7000开发流程之Petalinux (linux开发)
- zynq7000开发流程
- zynq开发之HLS
- 关于testbench的仿真步骤
- testbench——双向端口的仿真
- VHDL语言testbench仿真的例子
- ZYNQ 开发
- Xilinx Zynq使用HLS实现OpenCV的开发流程
- ModelSim之Testbench编写
- zynq 音乐播放流程
- 【ZYNQ-7000开发之三】ZYNQ平台的HDMI驱动测试
- Zynq-Linux移植学习笔记之20-Zynq linux can驱动开发
- testbench
- testbench
- 开始记录学习计划
- LeetCode - 148. Sort List
- oracle的存储过程
- 群聊天逆矩阵记录
- 服务器上只安装一份Tomcat,如何部署多个应用,要求每个应用使用不同的端口
- [zynq] zynq7000开发流程之仿真TestBench
- 近期javaWEB项目总结
- QApplication与QCoreApplication
- 链表的游标实现
- [5]AMQP(高级消息队列协议) ----如何创建自己的SSLContext对象
- 38. 后台模块开发(3)
- 轻量级Android网络请求框架
- Nginx Location配置
- 数组去重,简短而有效的方法