Verilog testbench总结
0赞
发表于 2014/6/4 19:28:25
阅读(3414)
- 时钟
- --------------------------------------------------------------------------------
parameter ClockPeriod=10; initial begin forever Clock=#(ClockPeriod/2)~Clock; end
- --------------------------------------------------------------------------------
initial begin always #(ClockPeriod/2)Clock=~Clock; end
- --------------------------------------------------------------------------------
- 系统复位任务封装
- --------------------------------------------------------------------------------
task reset; input [31:0] reset_time; //复位时间输入 begin rst_n=RST_ING; //复位中 #reset_time; //复位时间 rst_n=~RST_ING; //撤销复位 end endtask
- --------------------------------------------------------------------------------
- 激励信号
- 在测试设计中使用并行激励块提供必要的激励。两种方法被考虑:绝对时间激励和相对时间激励。
- 绝对时间激励:仿真变量被详细描述为相对于仿真时间零点。
- 相对时间激励提供初始值,然后再重出发激励前等待一个事件。
- --------------------------------------------------------------------------------
- Verilog-absoulute time
- --------------------------------------------------------------------------------
initial begin reset=1; load=0; count_updn=0; #100 reset=0; #20 load=1; #20 count_updn=1; end
- --------------------------------------------------------------------------------
- Verilog relative time
- --------------------------------------------------------------------------------
always@(posedge clock) TB_Count<=TB_Count+1; initial begin if(TB_Count<5) begin reset=1; load=0; count_updn=0; end else begin reset=0; load=1; count_updn=1; end end initial begin if(count==1100)begin count_updn<=0; $display("Terminal count reached,now counting down."); end end
- --------------------------------------------------------------------------------
- Verilog HDL testebench终端显示
- --------------------------------------------------------------------------------
initial begin $timeformat(-9,1,"ns",12); $display("Time clk rst ld shifitreg data sel"); $monitor("%t%b%b%b%b%b%b%b",$realtime,clk,rst,ld,shiftreg,data,sel); end
- --------------------------------------------------------------------------------
- Verilog实现设计
- 源代码
- --------------------------------------------------------------------------------
module shift_reg(clock,reset,load,sel,data,shiftreg); input clock; input load; input load; input [1:0] sel; input [4:0] data; output [4:0] shiftreg; reg [4:0] shiftreg; always@(posedge clock) begin if(reset) shiftreg=0; else if(load) shiftreg=data; else case(sel) 2'b00:shiftreg=shiftreg; 2'b01:shiftreg=shiftreg<<1; 2'b10:shiftreg=shiftreg>>1; default:shiftreg=shiftreg; endcase end endmodule
- --------------------------------------------------------------------------------
- testbench
- --------------------------------------------------------------------------------
module testbench(); reg clock; reg load; reg reset; wire [4:0] shiftreg; reg [4:0] data; reg [1:0] sel; shift_reg dut( .clock(clock), .reset(reset), .shiftreg(shiftreg), .sel(sel), .data(data) ); initial beign clock=0; forever #50 clock=~clock; end initial begin reset=1; data=5'b00000; load=0; sel=2'b00; #200; reset=0; load=1; #200; data=5'b011101; #100; sel=2'b01; load=0; #200; sel=2'b10; #1000; $stop; end initial begin $timeformat(-9,1,"ns",12); $display("Time Clk Rst Ld SftRg Data Sel"); $monitor("%t%b%b%b%b%b%b%b",$realtime,clock,reset,load,shiftreg,data,sel); end endmodule
- 区别对待双向信号
- --------------------------------------------------------------------------------
module bidir_infer(DATA,READ_WRITE); input READ_WRITE; inout [1:0] DATA; reg [1:0] LATCH_OUT; always@(READ_WRITE or DATA) begin if(READ_WRITE==1) LATCH_OUT<=DATA; end assign DATA=(READ_WRITE==1)?2'bz:LATCH_OUT; endmodule
- --------------------------------------------------------------------------------
- testbench
- --------------------------------------------------------------------------------
module test_bidir_ver; reg read_writet; reg [1:0] data_in; wire [1:0] datat,data_out; bidir_infer uut(datat,read_wirtet); assign datat=(read_wirtet==1)?data_in:2'bZ; assign data_out=(read_writet==0)?datat:2'bZ; initial begin read_writet=1; data_in=11; #50 read_wirtet=0; end endmodule
- --------------------------------------------------------------------------------
- force/release
- force/release 语句可以用来跨越进程对一个寄存器或一个电路网络的赋值。这
- 结结构一般用于强制特定的设计的行为。一旦一个强制值释放,这个信号保持它
- 的状态直到新的值被进程赋值。用法:
module testbench; ... initial begin reset=1; force DataOut=101; #25 reset=0; #25 release DataOut; ... ... end endmodule
- assign/deassign
- assign/deassign 语句与force/release 相类似,但是assign/deassign 只用于设计中
- 的寄存器。他们一般用于设置输入值。就象一个force 语句,assign 语句超越进程
- 语句的赋值。
- `timescales
- timescale 指示被用于为测试指定单位时间步。它也影响仿真器的精确度。表示
- 符号为:‘timescale reference_time/precision Reference_time 是一个用于测量的单位时间。Precision 决定延时应该达到的精
- 度,为仿真设置单位步距。以下是‘ timescale 的使用方法。
- 只读存储器初始化文件
- verilog提供了$readmemb和$readmemh命令来读取ascii文件来初始化存储器的内容。
- $readmemb("
",design_instance); - .文件说明
- .Netlist files:HDL Code经过合成后转出的.v文件。
- .Stimulus files:HDL变形的testbench.v经过value change dump转成.vcd,.vcd再经过VTRAN转成
- vector file(.vec) .vec是让软体用来给netlist当input pattern用的。
- .Configuration file
- testbench需要注意的点
- @与wait的区别
- @使用沿触发。
- wait语句都是使用电平触发。
- $sreadmemb(h)与readmemb(h)的区别
- $sreadmemb(Memory,StartAddr,FinishAddr,String,...):读字符串到Memory。
- $readmemb("File",Memory [,StartAddr,[FinshAddr]]):读取的第一个数字存储在地址StartAddr直到FinishAddr。
- .常用系统任务
- $time 返回64位整形时间。
- $stime 返回32位整型时间。
- $realtime 向调用它的模块返回实型模拟时间。
- 输入激励码产生方式:
- 用单独的always语句或assign赋值语言产生时钟信号;
- 用简单的initial语句块产生置/复位信号的激励;
- 在initial语句块中用循环语句块产生按一定规律变换的信号激励码
- 用task过程产生特殊信号的输入激励;
- 用三态buffer产生或监控Bidirectional信号的激励
- 必要时预估DUT的输出变换情形并加以比较。
- 用一个或多个initial语句块产生DUT的模拟激励向量。
- 用task、function定义DUT外部时序接口;
- task
- --------------------------------------------------------------------------------
task cpu_read; begin #30;data_valid=1; wait(data_read==1); #20;cpu_data=data_in; wait(data_read==0); #20;cpu_data=8'hzz; #30;data_valid=0; end endtask
- --------------------------------------------------------------------------------