在verilog中实现PIPO

在verilog中实现PIPO,verilog,icarus,Verilog,Icarus,我希望在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[3

我希望在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

有什么问题吗?

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

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

output reg [31:0] answer;

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

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

output reg [31:0] answer;

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

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
始终@(重置)
开始
如果(!重置)
开始
答案[31:0]=1'b0//阻塞分配
结束
结束
关于这个街区:
始终@(posedge时钟)
开始

回答[31:1]我建议您在描述组合逻辑时,使用阻塞赋值

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
始终@(重置)
开始
如果(!重置)
开始
答案[31:0]=1'b0//阻塞分配
结束
结束
关于这个街区:
始终@(posedge时钟)
开始

回答[31:1]这是带测试台的工作代码,这是带测试台的工作代码。您不应将寄存器的复位逻辑和寄存器的时钟逻辑拆分为单独的块。您应该有一个块
始终@(posedge时钟或negedge重置)
。在您的设计中,如果断言复位时时钟切换,时钟块仍将执行,这不是建立触发器模型的正确方法。您不应将寄存器的复位逻辑和寄存器的时钟逻辑拆分为单独的块。您应该有一个块
始终@(posedge时钟或negedge重置)
。在您的设计中,如果断言重置时时钟切换,则仍将执行时钟块,这不是建立触发器模型的正确方法。