HDLBits 写测试平台系列

TB/clock

Tb/clock

1.原题复现

在这里插入图片描述

2.思路以及代码:
	将输入设置为reg类型,输出设为wire类型,例化DUT,然后初始化CLK,利用一个always 来将clk无限翻转产生时钟周期。
	记住1ps/1ps 前者指的是时间单位,后者指代得是单位精度
`timescale 1ps/1ps
module top_module ( );
    	reg clk;
            dut dut (.clk(clk));
   always  #5  clk = ~clk;
    
    initial begin
       clk = 0; 
    end
    

    
endmodule

TB/tb1

原题链接

1.原题复现

在这里插入图片描述

2.思路以及代码

这个很简单,根据波形就可以得出相应得代码:

module top_module ( output reg A, output reg B );//
		
    // generate input patterns here
    initial begin
		A=1'b0;
        B=1'b0;
        #10
        A=1'b1;
        B=1'b0;
        #5
        A=1'b1;
        B=1'b1;
        #5
         A=1'b0;
        B=1'b1;
        #20
         A=1'b0;
        B=1'b0;
        
    end

endmodule

Tb/and

原题链接
1.原题复现

在这里插入图片描述

2.思路以及代码

首先一个测试模块 需要将时间单位定义下来:
`timescale 1ps/1ps 第一个1ps代表 时间单位为ps 第二个1ps代表时间精度为1ps

一般来说,输入类型写为reg
输出类型写为 wire

然后要将相应的DUT模块进行例化(将tb里面的输入和输出以及定义的中间变量传递进去)。
最后 利用一个initial begin end 过程块来进行对输入在不同时刻进行不同的赋值
如果需要用到时钟的话,就利用 always # xx clk = ~clk ;
这里也可以用
initial begin
clk = 1’b0;
forever begin
#5
clk = ~clk;
end
end

Tb/tb2

原题链接

1.原图复现

在这里插入图片描述

2.思路以及分析

根据波形图的不同时刻来对输入进行控制即可,要注意位宽的正确:

module top_module();
    reg clk;
    reg in ;
    reg [2:0] s;
    wire out;
    
    q7 a1 (	.clk(clk),
           	.in(in),
           .s(s),
           .out(out)
          );
    
       initial begin
        clk = 1'b0;
        forever begin
        #5
        clk = ~clk;
        end
    end
    initial begin
       	clk=0 ;
        s = 3'd2;
        in =1'b0;
        #10;begin 
        s = 3'd6;
        in =1'b0;
        end
        #10 ; begin
        in =1'b1;
        s =3'd2;
        end
        #10;
        in =1'b0;
        s = 3'd7;
        #10;
        in =1'b1;
        s  =3'd0;
        #30;
        in =1'b0;
        s =3'd0;
    end
endmodule

Tb/tff

原题链接

1.原题复现

在这里插入图片描述

2.思路以及代码

将clk放置在一个initial begin
end
将reset 放置在一个initial begin
end

module top_module ();
    reg clk;
    reg reset;
    reg t;
    wire q;
    tff instance1 (
        .clk(clk),
        .reset(reset),
        .t(t),
        .q(q)
    );
    
    initial begin
       clk = 1'b0;
        forever  begin #5 clk = ~clk;
        end
    end
    initial begin
        reset = 1'b0;
       #4; 
        reset = 1'b1;
       #10; 
        reset = 1'b0;
    end
    always@(posedge clk)begin
        if(reset) begin
           	t<=1'b0; 
        end
        else begin
            t<=1'b1;
        end
    end
endmodule```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值