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