【问题标题】:Non Blocking or Blocking assignment for a buffer?缓冲区的非阻塞或阻塞分配?
【发布时间】:2014-04-13 21:29:25
【问题描述】:

我正在尝试在 Verilog 中实现一个小行缓冲区。我从一端放入数据并从另一端读取数据。

wire [29:0] temp_pixel;
reg  [29:0] temp_buffer[2:0];

我可以使用像这样的阻塞赋值语句,它应该可以按预期工作。

always @(posedge TD_CLK27)
begin
temp_buffer[0] = temp_buffer[1];
temp_buffer[1] = temp_buffer[2];
temp_buffer[2] = temp_pixel;
end

但是,我可以使用非阻塞语句(如下所示)并仍然得到预期的结果吗?或者 temp_buffer[1] 在被读取到 temp_buffer[0] 之前会被 temp_buffer[2] 覆盖吗?

always @(posedge TD_CLK27)
begin
temp_buffer[0] <= temp_buffer[1];
temp_buffer[1] <= temp_buffer[2];
temp_buffer[2] <= temp_pixel;
end

这两个块的工作方式是否相同,还是必须强制阻塞赋值语句,为什么?

【问题讨论】:

  • 这些例子都没有创建缓冲区。第一个创建 1 个触发器,第二个创建 3 个触发器。
  • @N8TRO 你能解释一下它是如何创建一个触发器的吗?

标签: buffer verilog fpga fifo


【解决方案1】:

这个阻塞的最小例子,注意=

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] = data_in;
   temp[1] = temp[2];
   temp[0] = temp[1];
end

assign data_out = temp[0];

endmodule

创建 1 个触发器:

虽然非阻塞,但请注意&lt;=

module test(
input  data_in, clk,
output data_out
);

reg [2:0] temp;

always @(posedge clk)
begin
   temp[2] <= data_in;
   temp[1] <= temp[2];
   temp[0] <= temp[1];
end

assign data_out = temp[0];

endmodule

创建 3 个触发器:

缓冲区是这样创建的:

module test(
input  data_in, clk,
output data_out
);

wire [2:0] temp;

   buf(temp[2], data_in);
   buf(temp[1], temp[2]);
   buf(temp[0], temp[1]);

assign data_out = temp[0];

endmodule

更多信息here.

【讨论】:

    【解决方案2】:

    两个块不同。

    当您使用阻塞赋值时,下一条语句在赋值完成之前不会开始执行。

     x = #5 y + z;
    

    该语句执行如下:

    1. 评估 RHS 表达式并保存结果
    2. 等待指定的延迟
    3. 执行分配

    因此,在您的情况下,分配您创建的缓冲区时没有延迟,verilog 将其解释为单个触发器。

    x <= y + z;
    

    正常的非阻塞赋值执行如下:

    1. 评估 RHS 表达式并将结果保存在临时缓冲区中
    2. 完成程序块中除其他非阻塞分配之外的所有其他事件的执行
    3. 最后执行作业。

    因此,在您的第二个示例中,temp_buffer[2] 获取之前的值 temp_buffer[1]。所以有一个周期延迟,在此之前您可以访问该值。所以在你得到实际输出之前有一串触发器(取决于你的代码)。

    同样,上一个答案中的链接是一篇很好的论文。这里还有一些 Sunburst Design Link2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多