Verilog位移位

Verilog位移位,verilog,Verilog,我刚刚开始学习verilog,我偶然发现了这个问题。因此,我试图制作一个位移位器,在每次上升的时钟脉冲中,将输入位向左移位一次。然而,当我尝试运行模拟时,输出结果显示为XXXX。任何帮助都将不胜感激 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]te

我刚刚开始学习verilog,我偶然发现了这个问题。因此,我试图制作一个位移位器,在每次上升的时钟脉冲中,将输入位向左移位一次。然而,当我尝试运行模拟时,输出结果显示为XXXX。任何帮助都将不胜感激

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
模块左移(参数i=3)(
输入时钟,
输入rst,
将[i:0]数据_输入,
输出寄存器[i:0]数据\u输出
);
导线[i:0]英寸;
赋值in=数据_in;
注册[i:0]温度;
始终@(posedge clk)开始
如果(rst==1)开始

temp看起来您正在使用同步
重置
,您的问题主要是由于在模拟开始时没有在TB中断言
重置
。在继续模拟的其余部分之前,您需要使用
reset
信号遵循至少1个断言解除断言序列


至于您的代码,正如Patrick指出的,您不需要在
中创建额外的
连接[i:0]。您可以直接执行
temp,然后立即执行非阻塞分配和阻塞分配。我怀疑这可能与你的问题有关。顺便说一句,
assign in=data\u in
的好处是什么?由于它是
导线
而不是
reg
(您将在
始终
块中分配到它),我认为如果您使用
temp,您需要提供测试台代码的片段,它不会改变任何事情