目录
写在前面
Verification Writing Testbenches
clock
Tb/tb1
Tb/and
Tb/tb2
Tb/tff
以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步!
终于完成了 HDLBits 刷题,虽然说难度不大,但是有些题目题目还是有锻炼价值的,值得一刷。
提供一个具有以下声明的模块:
module dut ( input clk ) ;
编写一个测试平台,创建一个模块 dut 实例(具有任何实例名称),并创建一个时钟信号来驱动模块的 clk 输入。时钟的周期为 10 ps。时钟应初始化为零,其第一个转换为 0 到 1。
module top_module();
reg clk;
initial begin
clk = 'd0;
end
always #5 clk = ~clk;
dut dut_inst(
clk
);
endmodule
创建一个 Verilog 测试平台,该测试平台将为输出 A 和 B 生成以下波形:
module top_module ( output reg A, output reg B );//
// generate input patterns here
initial begin
A = 'd0;
B = 'd0;
#10
A = 'd1;
#5
B = 'd1;
#5
A = 'd0;
#20
B = 'd0;
end
endmodule
您将获得以下要测试的 AND 门:
module andgate (
input [1:0] in,
output out
);
通过生成以下时序图,编写一个实例化此 AND 门并测试所有 4 种输入组合的测试平台:
module top_module();
reg [1:0] in;
wire out;
initial begin
in = 'd0;
#10
in = 'd1;
#10
in = 'd2;
#10
in = 'd3;
end
andgate andgate_inst(in, out);
endmodule
下面的波形设置 clk、in 和 s:
模块 q7 具有以下声明:
module q7 (
input clk,
input in,
input [2:0] s,
output out
);
编写一个测试平台,实例化模块 q7 并完全按照上述波形所示生成这些输入信号。
module top_module();
reg clk;
reg in;
reg [2:0] s;
wire out;
initial begin
clk = 'd0;
in = 'd0;
s = 'd2;
#10
s = 'd6;
#10
in = 'd1;
s = 'd2;
#10
in = 'd0;
s = 'd7;
#10
in = 'd1;
s = 'd0;
#30
in = 'd0;
end
always #5 clk = ~clk;
q7 q7_inst (clk, in, s, out);
endmodule
您将获得一个具有以下声明的 T 触发器模块:
module tff (
input clk,
input reset, // active-high synchronous reset
input t, // toggle
output q
);
编写一个测试平台,该测试平台实例化一个tff,并将重置T触发器,然后将其切换到“1”状态。
module top_module ();
reg clk;
reg reset;
reg t;
wire q;
initial begin
clk = 'd0;
reset = 'd1;
#10
reset = 'd0;
end
always #5 clk = ~clk;
always @(posedge clk) begin
if (reset) begin
t <= 'd0;
end
else begin
t <= 'd1;
end
end
tff tff_inst(clk, reset, t, q);
endmodule