我写了一个并行的串行输出移位寄存器,我在这里提出。
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
移位等)。
我是否以错误的方式使用了分配?任何人都可以指出这个问题吗?
答案 0 :(得分: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
/*
Prints:
0 regout=x
5 regout=0
*/