module register(input [7:0] inp, input load,clk,clr, output reg [7:0] out);
always@(posedge clk or posedge clr) begin
if(clr)
out <= 8'b00000000;
else if(load)
out<= inp;
end
endmodule
module register_tb;
reg [7:0] inp;
reg load,clk,clr;
wire [7:0] out;
integer count1,count2;
register store(inp,load,clk,clr,out);
initial begin
clk = 1'b0;
repeat(2**10) #10 clk = {$random};
end
initial begin
for(count1 = 0;count1<2**8;count1 = count1 + 1) begin
for(count2 = 0;count2<4;count2 = count2 + 1) begin
{clr,load} = count2;
{inp} = count1;
#10;
end
end
end
endmodule
我正在尝试制作一个 4 位寄存器,但我遇到了这个错误。 我无法理解为什么我的代码总是输出零。我尝试调试它,但找不到错误。
如波形所示,
out
并非始终为 0;它确实改变了价值。
您设计的代码看起来不错,但您的测试平台代码没有遵循同步逻辑的良好实践。这就是为什么您会看到奇怪的
out
波形。
我建议使用占空比为 50% 的时钟信号,并使用非阻塞分配来驱动时钟的所有其他输入,如下所示:
module register_tb;
reg [7:0] inp;
reg load,clk,clr;
wire [7:0] out;
integer count1,count2;
register store(inp,load,clk,clr,out);
initial begin
clk = 1'b0;
forever #10 clk = ~clk;
end
initial begin
clr = 1;
load = 0;
inp = 5;
repeat (2) @(posedge clk);
clr <= 0;
repeat (2) @(posedge clk);
load <= 1;
repeat (1) @(posedge clk);
load <= 0;
repeat (5) @(posedge clk);
$finish;
end
endmodule
波浪:
您可以清楚地看到
out
从0变为5。