Testbench编写指南(2)文件的读写操作

4 篇文章 38 订阅

Testbench编写指南是博主新开的一个系列,主要介绍在编写testbench时使用到的技巧,让编写者的水平不再仅仅停留在时钟信号、复位信号等简单信号的设置上,更好的完成对设计的仿真工作。

第2篇的题材是文件的读写控制,仿真时经常需要从文件中读取测试激励,还要将仿真结果存取在文件中供其它程序读取调用。


读取txt文件数据

示例代码如下:

integer i;   //数组坐标
reg [9:0] stimulus[1:data_num];  //数组形式存储读出的数据

initial 
begin
    $readmemb("SinIn.txt", stimulus);  //将txt文件中的数据存储在数组中
    i = 0;
    repeat(data_num) begin   //重复读取数组中的数据
        i = i + 1;
        din = stimulus[i]; 
        #clk_period;         //每个时钟读取一次
    end
end           

用“数组”来表述Verilog HDL中的定义并不准确,但对大多数人来说应该更好理解。可以将stimulus视作一个存储器,[9:0]定义了数据的位宽,[1:data_num]定义了存储器的深度。stimulus的定义应该与txt文件中的数据相匹配。txt文件中每行存储一个数据,则上述定义对应的是txt中存储了data_num个数据,每个数据的最大位宽为10bit。

读取二进制格式的文件是用系统任务 readmemb使 r e a d m e m b ; 读 取 十 六 进 制 格 式 文 件 使 用 readmemh。其命令为$readmemb(“filename”, mem_name),将filename中的内容读取到mem_name中。

注意filename文件路径中应该用反斜杠“/”,与windows系统中的文件路径使用的“\”不同。如果不指定路径,向上面程序一样直接写文件名字,那么该文件必须和testbench文件在同一路径下。

repeat(n) begin … end中的内容应该根据设计的需要编写。


将数据写入txt文件

示例代码如下:

integer file_out;
initial
begin
    file_out = $fopen("mixer_out.txt");
    if (!file_out) begin
        $display("can't open file");
        $finish;
    end
end            

wire signed [19:0] dout_s = dout;
wire rst_write = clk & rst_n;         //复位期间不应写入数据
always @ (posedge rst_write)   
    $fdisplay(file_out, "%d", dout_s);

写入文件需要先用$fopen系统任务打开文件,这个系统任务在打开文件的同时会清空文件,并返回一个句柄,如果句柄为0则表示打开文件失败。

如果原来不存在该文件,则会自动创建该文件。

打开文件之后便可以用得到的句柄和$fdisplay系统任务向文件中写入数据。这个系统任务和我们在C++中常用的fprintf函数的用法很像。

上面的程序中是将数据转换为带符号数signed后再写入,必须说明转换与否是有差别的,如果按默认的unsigned的格式写入txt的是无符号数。

另外,每使用一次$fdisplay,都会在数据后插入一个换行符。

  • 46
    点赞
  • 352
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
TestBench编写是验证设计正确性的重要步骤。以下是一些编写TestBench指南: 1. 了解仿真器特性:不同的仿真器具有不同的特性和性能差异,可能会导致不同的仿真结果。了解仿真器的工作原理和特点对于编写高效的TestBench很重要。 2. 设计时钟信号:时钟信号是设计中最重要的信号之一,需要在TestBench中生成一个稳定的时钟信号。这可以通过使用initial块和一些逻辑来实现。 3. 提供激励:TestBench需要提供适当的激励来测试设计。这可以通过调用设计的输入端口或使用测试向量来完成。 4. 终端显示:为了方便观察和验证结果,TestBench可以将设计的输出结果显示在终端或波形窗口上。这可以使用$display或$monitor命令来实现。 5. 遵循设计规则:编写TestBench时,需要遵循一些设计规则。例如,了解仿真器的特性和性能差异,避免使用无限循环等。 6. 分散激励:为了提高编写、维护和更新TestBench代码的效率,可以将不相关的激励分散到独立的逻辑块中。 7. 避免显示不重要的数据:对于大型设计,显示大量的数据会拖慢仿真速度。建议只显示重要的信号数据,并且可以设置显示间隔以保持足够的仿真速度。 以上是编写TestBench的一些基本指南,根据实际情况可能还会有其他特定的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Testbench编写指南(1)基本组成与示例](https://blog.csdn.net/FPGADesigner/article/details/82021647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值