我刚刚开始学习如何学习verilog,我偶然发现了这个问题。所以我试图做一个移位器,将输入位向左移动一次,用于每个上升时钟脉冲。但是,当我尝试运行模拟时,输出结果为XXXX。任何帮助将是apreciated
module shift_left #(parameter i=3)(
input clk,
input rst,
input [i:0]data_in,
output reg [i:0]data_out
);
wire [i:0]in;
assign in=data_in;
reg [i:0]temp;
always @(posedge clk)begin
if(rst==1)begin
temp<=in;
end
else
data_out<=temp;
temp<=temp<<1;
temp[0]=1'b0;
end
endmodule
答案 0 :(得分:1)
看起来您正在使用同步reset
,而您的问题主要是由于在模拟开始时未在TB中声明reset
。在继续进行模拟的其余部分之前,您需要使用reset
信号跟随至少1个断言 - 反断言序列。
至于你的代码,正如帕特里克指出的那样,你不需要创建额外的wire [i:0] in
。您可以直接在temp <= data_in
区块中always
进行操作。
此外,无需执行temp[0] = 1'b0;
,因为左移位运算符<<
将自动负责向LSB插入零。
建议:不要在同一个always
块中混合阻塞和非阻塞语句,至少在你刚刚开始学习Verilog时不会这样做