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
```