串行输出移位寄存器不确定

问题描述 投票:0回答:1

我写了一个并行输入串行输出移位寄存器,我在这里展示。

module shiftreg32b (clk, reset, shift, carrega, in, regout);
    input clk;
    input reset, shift;
    input carrega;
    input [31:0] in;

    output regout;

    reg [31:0] inreg;

    assign regout = inreg[31];

    always @ (posedge clk)
    begin
        if (reset == 1) inreg <= 32'd0;
            else if (carrega) inreg <= in;
                else if (shift) inreg <= {inreg[30:0], 1'b0};
    end

endmodule

我发现的问题是这个移位寄存器的输出始终是未知的(

StX
),即使我已经设置了
assign regout = 0;
来确定。测试非常简单,其他一切都工作正常(当启用
inreg
时,
shift
会发生变化,等等)。

我是否以错误的方式使用了分配?谁能指出问题所在吗?

verilog system-verilog shift-register
1个回答
0
投票

assign
是正确的。

由于您没有提供测试平台,我最好的猜测是您有多个

regout
驱动程序,最有可能是当您将输出端口连接到其他设备时。

使用这个最小的测试平台,我看到

regout
从 X 变为 0,正如预期的那样

module tb;

    reg clk;
    reg reset, shift;
    reg carrega;
    reg [31:0] in;
    wire regout;

initial begin
    $monitor($time, " regout=%b", regout);
    $dumpvars;
    clk = 0;
    reset = 1;
    carrega = 0;
    shift =0;
    in=0;
    #50 $finish;
end

always #5 clk = !clk;

shiftreg32b shiftreg32b (clk, reset, shift, carrega, in, regout);

endmodule

打印:

                   0 regout=x
                   5 regout=0
© www.soinside.com 2019 - 2024. All rights reserved.