在verilog中实现PIPO

Posted

技术标签:

【中文标题】在verilog中实现PIPO【英文标题】:Implementing PIPO in verilog 【发布时间】:2013-08-17 08:46:24 【问题描述】:

我希望在 verilog HDL 中实现 32 位并行并行输出。这是我写的代码...

module pipo(input_seq, answer,reset, clock);
   input [31:0] input_seq;
   input        reset,clock;
   output [31:0] answer;

   always @ (reset)
     begin
        if(!reset)
          begin
             answer[31:0]<=1'b0;
          end
     end

   always @ (posedge clock)
     begin
        answer[31:1]<=input_seq[30:0];  
     end

endmodule

但是这会导致以下错误日志(使用iverilog):

pipo.v:10: error: answer['sd31:'sd0] is not a valid l-value in pipo.
pipo.v:4:      : answer['sd31:'sd0] is declared here as wire.
pipo.v:16: error: answer['sd31:'sd1] is not a valid l-value in pipo.
pipo.v:4:      : answer['sd31:'sd1] is declared here as wire.
Elaboration failed

有什么问题?

【问题讨论】:

您不应将寄存器的复位逻辑和寄存器的时钟逻辑拆分为单独的块。你应该有一个块always @(posedge clock or negedge reset)。在您的设计中,如果在置位复位时时钟切换,时钟模块仍将被执行,这不是模拟触发器的正确​​方法。 【参考方案1】:

您使用answer 作为寄存器,但它被声明为线。 Wire是连接两点的东西,因此没有任何驱动力。另一方面,reg 可以存储价值和驱动力。

answer 的声明更改为reg,它应该会有所帮助。

output reg [31:0] answer;

【讨论】:

这是EDA Playground上带有测试台的工作代码【参考方案2】:

我建议你在描述组合逻辑时,使用阻塞赋值。

always @ (reset)
   begin
     if(!reset)
       begin
         answer[31:0]=1'b0; //blocking assignment
       end
   end

About this block:

always @ (posedge clock)
  begin
    answer[31:1]<=input_seq[30:0];  
  end

您可以通过输出 output reg [31:0] answer 来修复错误,这样您就可以在 always 块中分配一个输出。

【讨论】:

以上是关于在verilog中实现PIPO的主要内容,如果未能解决你的问题,请参考以下文章

关于总是阻止在verilog中实现ARM cpu

在 Verilog 中实现一个 32x64 的寄存器文件

用于 System Verilog 中的逻辑实现

由于verilog与verilator中的无符号算术错误,比较是恒定的

verilog 二维数组是如何初始化的啊?

在System Verilog中计算浮点值的e ^ x?