Verilog位移

时间:2018-04-20 02:30:29

标签: verilog

我刚刚开始学习如何学习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

1 个答案:

答案 0 :(得分:1)

看起来您正在使用同步reset,而您的问题主要是由于在模拟开始时未在TB中声明reset。在继续进行模拟的其余部分之前,您需要使用reset信号跟随至少1个断言 - 反断言序列。

至于你的代码,正如帕特里克指出的那样,你不需要创建额外的wire [i:0] in。您可以直接在temp <= data_in区块中always进行操作。

此外,无需执行temp[0] = 1'b0;,因为左移位运算符<<将自动负责向LSB插入零。

建议:不要在同一个always块中混合阻塞和非阻塞语句,至少在你刚刚开始学习Verilog时不会这样做