4位寄存器始终显示输出0

问题描述 投票:0回答:1
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 位寄存器,但我遇到了这个错误。 我无法理解为什么我的代码总是输出零。我尝试调试它,但找不到错误。

verilog system-verilog test-bench
1个回答
0
投票

如波形所示,

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。

© www.soinside.com 2019 - 2024. All rights reserved.