始终Verilog RTL文件中的模块不起作用,但工作一次包含在testbench中

时间:2015-03-18 01:46:46

标签: verilog register-transfer-level

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

我正在尝试实现一个移位寄存器,它将输入PI移动shft端口中指定的值。当我在RTL文件中包含移位逻辑时,移位不起作用,但是当我移动对应于移位到测试平台的always块时,它可以工作。请帮帮我!

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

2 个答案:

答案 0 :(得分:1)

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

回想一下,Verilog支持>><<运算符。对于非常数的多位操作数,这可能是浪费多路复用器,但是:

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

答案 1 :(得分:0)

请注意,||是合乎逻辑的,或者理想情况下应与(shft_reg[0] == 1'b1 ) || ( shft_reg[1] == 1'b1)等逻辑规则一起使用。

你的if语句实际上是按位ORing所有位,即

shft_reg[0] | shft_reg[1] | shft_reg[2] | ...

您可以使用OR Reduction运算符:

|shft_reg

您提供的代码中包含了错误的P&P PI。

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