Verilog RTL文件中的模块始终不工作,但一旦包含在测试台中就可以工作

Verilog RTL文件中的模块始终不工作,但一旦包含在测试台中就可以工作,verilog,register-transfer-level,Verilog,Register Transfer Level,这似乎是一个非常幼稚的问题,但我刚刚开始使用Verilog(如果有帮助的话,我使用Xilinx ISE) 我试图实现一个移位寄存器,将输入的PI移位到shft端口中指定的值。当我在RTL文件中包含移位逻辑时,移位不起作用,但当我将与移位相对应的always块移动到testbench时,它起作用。请帮我做这个 module shift (PI, shft, clk, PO); input [7:0] PI; input clk; input [7:0] shft; output reg [13

这似乎是一个非常幼稚的问题,但我刚刚开始使用Verilog(如果有帮助的话,我使用Xilinx ISE)

我试图实现一个移位寄存器,将输入的
PI
移位到
shft
端口中指定的值。当我在RTL文件中包含移位逻辑时,移位不起作用,但当我将与移位相对应的always块移动到testbench时,它起作用。请帮我做这个

module shift (PI, shft, clk, PO);
input  [7:0] PI;
input clk;
input [7:0] shft; 
output reg [13:0] PO;
reg [7:0] shft_reg;
always @(posedge clk) begin
  if  (shft_reg[0]||shft_reg[1]||shft_reg[2]||shft_reg[3]||shft_reg[4]||shft_reg[5]||shft_reg[6]||shft_reg[7]) begin 
      PO <= {PO, 0};
      shft_reg <= shft_reg-1;
  end 
end
endmodule
模块移位(PI、shft、clk、PO);
输入[7:0]PI;
输入时钟;
输入[7:0]shft;
输出reg[13:0]采购订单;
注册号[7:0]shft_注册号;
始终@(posedge clk)开始
如果(shft|U reg[0]| shft|U reg[1]| shft|U reg[2]| shft|U reg[3]| shft|U reg[4]| shft|U reg[5]| shft|U reg[6]| shft|U reg[7])

PO注意,
|
是一个逻辑or,理想情况下应与逻辑语句一起使用,如
(shft_reg[0]==1'b1)| |(shft_reg[1]==1'b1)

你的if语句真的是按位ORing所有的位

shft_reg[0] | shft_reg[1] | shft_reg[2] | ...
您可以使用OR还原运算符:

|shft_reg
您提供的代码输入了PO的PI

always @(posedge clk) begin
  if  (|shft_reg) begin 
      PO       <= {PI, 0}; //PI input 
      shft_reg <= shft_reg-1;
  end 
end
始终@(posedge clk)开始
如果(| shft_reg)开始

PO您没有在逻辑中使用输入
PI
。我已经在测试台上将PO初始化为PI。这有点不确定,是真的。这是不好的,原因有很多:shft_reg不是要移位,而是要减法。OP表示他希望将PI移位至shft_reg.中指定的值。因此,它必须在每个时钟周期上递减。第二:PO不会将PI的值进行移位,但始终会接收相同的值,即附加位0的PI。第三:shft_reg是要与0进行比较,看看是否有更多的移位,因此,与0进行比较,让合成器决定是推断一个N输入或门,还是一个比较器更好:无论它是否更适合目标体系结构。您有
if(shft_reg)在SfttReg是多比特的情况下,我会考虑这个错误的做法。为什么?它和(SfttReg!=0)一样,不是吗?我会考虑和0个坏的练习进行比较。我总是会调整比较的大小
==8'd0
。然后您会得到关于宽度不匹配的正确警告。它停止了将多个位与单个位启用混淆,我发现它有助于代码的可读性。在这种情况下,我会考虑<代码> SfttReg!8'd0
将是最佳选择。谢谢!如果我有足够的声誉,我会投票支持这一点。我也以这种方式实现了它,但我有一个一般性的问题——在模块中我永远不能有一个顺序逻辑块(总是),然后在实例化它时使用它。在这种情况下,一个纯粹的组合逻辑块起作用了,但是,比如说,我被迫使用顺序逻辑(比如插入一个延迟块),我该怎么做呢?恐怕我不理解你的问题。你能举个例子吗?您说您被迫使用顺序逻辑,因此第二种解决方案不适合您,但第一种解决方案确实使用顺序逻辑。
module shift (
    input wire clk;
    input wire load;  // load shift register from input
    input wire [7:0] PI;
    input wire [7:0] shft; // this might need less bits
    output wire [13:0] PO;
    );

    reg [7:0] shft_reg;
    reg [13:0] value;
    assign PO = value; // PO follows value 
    always @(posedge clk) begin
      if (load) begin  // initialize shift register and counter
        shft_reg <= shft;
        value <= {6'b0,PI};
      end
      else if (shft_reg) begin // if counter not reached end...
        shft_reg <= shft_reg - 1;  // decrement, and
        value <= {value[13:1],1'b0};  // shift left value 1 bit
      end
  end 
end
endmodule
module shiftcomb (
    input wire [7:0] PI;   // this value is left shifted
    input wire [2:0] shft; // 0 to 7 bits positions
    output wire [14:0] PO; // and is outputted to PO
    );

    assign PO = PI<<shft; // this will generate 15 mutlplexers:
                          // each one with 8 inputs, 3 bit select,
                          // and 1 output.
endmodule