四、Testbench



基本都是不可综合语句

一、initial

initial语句用来对变量进行初始化,仿真器在仿真时刻0就可以得到初始值,如果不进行初始化,变量初始化为X。

initial
begin
	clock = 1‘b0;
	forever begin  //循环语句
		#5 clock = ~clock;  //5ns偏转一次,为10ns时钟,对应100MHz
	end
end

二、$finish $stop

$finish表示仿真结束

$stop表示仿真停止,但是不退出,在命令提示符后输入. 继续执行

三、$display $monitor

$display 打印,显示错误异常信息为主

$monitor相似功能,但是每次观察的信号发生改变就会打印一次。

四、$time $realtime

$time 64位整数乘以`timescale 1ns/10ps 的仿真时间单位(1ns),再四舍五入。

$realtime相似功能,但是返回值包括小数。

当`timescale 1ns/10ps时候,对应9.4ns

$time返回9ns
$realtime返回9.4ns

五、$random $random(seed)

$random取随机数,返回一个32位的带符号的随机整数。

{$random} 非负整数。

$random(seed) 其中seed指出随机数的序列

六、$readmemb $readmemh

$readmemb 用于存储器建模时的初始化,将一个文本文件里的数据,写入存储器。

$readmemh 其中readmemb 以二进制数的形式写入,readmemh以十六进制数写入。

`timescale 1ns/10ps
module myrom (read_data, addr, read_en_);
    input read_en_;
    input [3:0] addr;
    output [3:0] read_data;
    reg [3:0] read_data;
    reg [3:0] mem [0:15];
    initial
        $readmemb ("my_rom_data", mem);
    always @( addr or read_en_)
        if (! read_en_)
            read_data = mem[addr];
endmodule

七、$fopen $fclose

可以打开和关闭文件,用
$fdisplay写进信息到文件中。

八、task

任务,可以用来写函数,是按顺序执行的过程。
通常用于读取和写数据到存储器来

九、存储器

可以用数组搭一个存储器来,

reg [7:0]  rom [1023:0];

用下面的任务可以初始化作用
在这里插入图片描述

十、while for repeat

while以及for就是循环语句

repeat和for等价
repeat(3)等价于 for(integer i=0;i<3;i++)

十一、force release

force用来将固定值赋值给reg或者wire类型变量

release执行前变量值不会发生改变,执行后由具体驱动决定

十二、fork/join

fork/join内部的语句并发执行,当全部完成后才会执行后面的语句,内部用于并发执行多个仿真任务。

总结

我的Testbench模板

`timescale 1ns / 1ps
`define  CLK_PERIOD 8     //125MHz
//
// School: Shanghaitech
// Engineer: Junluoyu
// 
// Create Date: 2021/09/30 
// Design Name: 
// Module Name: _tb
// Project Name: 
// Target Devices: ZCU106
// Tool Versions: vivado2019.1
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module _tb(

    );
/*----------------------例化------------------------*/

/*----------------------时钟信号---------------------*/
initial clk = 1;
always #(`CLK_PERIOD/2) clk=~clk; 
/*----------------------initial信号------------------*/
initial begin
    
end
endmodule
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个对应的 Testbench,用于验证流水线型并行加法树的功能: ```verilog module ParallelAdderTree_tb; parameter DW = 8; // 输入位宽 parameter N = 4; // 并行数据深度 reg clk; reg reset; reg [DW-1:0] A; reg [DW-1:0] B; wire [2*DW-1:0] Sum; // 实例化被测设计模块 ParallelAdderTree dut ( .clk(clk), .reset(reset), .A(A), .B(B), .Sum(Sum) ); // 时钟生成 always begin clk = 0; #5; clk = 1; #5; end // 测试向量生成 initial begin reset = 1; A = 0; B = 0; #10; reset = 0; // 测试用例 1 A = 2; B = 3; #10; $display("Sum = %d", Sum); // 测试用例 2 A = 5; B = 7; #10; $display("Sum = %d", Sum); // 测试用例 3 A = 10; B = 15; #10; $display("Sum = %d", Sum); // 添加更多测试用例... $finish; end endmodule ``` 在这个 Testbench 中,我们先实例化了被测设计模块 `ParallelAdderTree`,并将输入和输出端口连接到 Testbench 中的信号。然后,我们使用一个时钟生成模块来产生时钟信号,并在初始化过程中生成了一些测试用例。 在测试用例中,我们首先将 `reset` 信号置为高电平来进行复位,并设置输入 `A` 和 `B` 的初始值。接着,在一段时间后将 `reset` 信号置为低电平,开始进行功能测试。我们通过改变输入信号的值来测试不同的情况,并使用 `$display` 函数来显示输出结果 `Sum`。 请注意,这只是一个简单的 Testbench 示例,您可以根据实际需求添加更多的测试用例和功能验证。希望这对您有所帮助!如果有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun_luo_yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值