Verilog testbench常用块

1.系统功能块

1. 本地文件读入,后两项可缺省

$readmemb ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)

reg [379:0] CAL2_sample[0:2999];
initial $readmemb ( "./../matlab/ideal_high_freq_sample_bits.txt", CAL2_sample,0,2999 );

tdc_finecode_i <= CAL2_sample[samlpe_cnt];

2. 将打印结果保存至文档

// finetime_o finetime_valid_o 为dut输出
integer fid;
initial
	fid = $fopen("fintimeout_ideal1.txt","w");
	
integer finetime_cnt=0;
always@(posedge main_pll_clk_80m_i or negedge rst_n) begin
	if(!rst_n) begin
		finetime_cnt <= 'd0;
	end
	else if(finetime_cnt==2999) 
		$fclose(fid); 
	else if(finetime_valid_buf==2'b01) begin
		finetime_cnt <= finetime_cnt + 1'b1; 
		$fwrite(fid,"%d\n",finetime_o); 
		$display("%d",finetime_o);
	end 
	finetime_valid_buf <= {finetime_valid_buf[0],finetime_valid_o};
end

3. 产生随机数

//产生0~CH_NUM-1的数随机数,若不加{}则产生 -(CH_NUM-1)~CH_NUM-1的随机数
datain_channel_sel_i <= 1<<({$random} %CH_NUM);

4. 仿真时状态机命名(.do脚本中编写)

virtual type {
	{01 ST_IDLE}
	{02 ST_LOAD}
	{04 ST_COR }
	{08 ST_BACK}
	{10 ST_DONE}
	{20 ST_WAIT}
} vir_new_signal

#将工程中状态机名称按照之前定义的 vir_new_signal 格式进行强制类型转换,转换的新名为 new_state
 virtual function {(vir_new_signal)edge_correct_tb/edge_correct_dut/CS} new_state
 add wave 	-color red	 edge_correct_tb/edge_correct_dut/new_state

5. 头文件

`include "../../PARAMETERS.v"
多模块仿真时,可以包括一些统一的参数,如
`define G_STATISTICS_NUM  8000
`define G_INIT_REF_IDX  1
`define G_ALTER_REF_IDX  108
`define G_NEED_UPDATE_REF_NUM  260

在tb文件中可以如下调用:
  initial begin
    begin
      alter_ref_idx_i = `G_ALTER_REF_IDX;
      init_ref_idx_i = `G_INIT_REF_IDX;
      clk_need_update_ref_num_i = `G_NEED_UPDATE_REF_NUM;
    end
  end
```

猜你喜欢

转载自blog.csdn.net/qq_43445577/article/details/109709146