我写了一个并行输入串行输出移位寄存器,我在这里展示。
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
会发生变化,等等)。
我是否以错误的方式使用了分配?谁能指出问题所在吗?
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