【问题标题】:SystemVerilog Sequential Circuits Coding StyleSystemVerilog 时序电路编码风格
【发布时间】:2023-02-23 02:52:15
【问题描述】:

我目前正在通过 Pong Chu 的工作通过 System Verilog 示例进行 FPGA 原型设计,特别是第 4 章,其中介绍了时序电路。 Chu在其中描述了时序电路具有时序部分和组合部分的方法。到目前为止,一切都很好。作为一个例子,他展示了一个带同步清除的 D FF 是如何编码的:

module d_ff_sync_clr_2seg
   (
    input  logic clk,
    input  logic syn_clr,
    input  logic d,
    output logic q
   );

   // signal declaration
   logic r_reg, r_next;

   // body
   // D FF
   always_ff @(posedge clk)
      r_reg <= r_next;

   // next-state logic
   always_comb
      if (syn_clr)
         r_next = 1'b0;
      else
         r_next = d;

   // output logic
   assign q = r_reg;
endmodule

在讨论中,他指出 syn_clr 信号仅在时钟的上升沿检查。他还为我发现更清晰的同一电路提供了不同的格式样式:

module d_ff_sync_clr_1seg
   (
    input  logic clk,
    input  logic syn_clr,
    input  logic d,
    output logic q
   );

   // body
   always_ff @(posedge clk)
      if (syn_clr)
         q <= 1'b0;
      else
         q <= d;
endmodule

在第二个例子中(d_ff_sync_clr_1seg), 我可以清楚地看到,是的,在时钟的上升沿总是_ff块被激活并且syn_clr确实被采样了。

在第一个(d_ff_sync_clr_2seg), 更长的例子, Chu 的陈述syn_clr仅在时钟的上升沿检查不那么清楚。我的想法是,当syn_clr变化,总是梳块被激活,并且r_next更新为 1'b0 或d.然后,在时钟的上升沿,r_reg被赋予的价值r_next,因为它是在总是梳堵塞。如此间接地看起来,syn_clr(或检查结果syn_clr) 在时钟的上升沿被采样。我看不到发生的事情之间的联系总是_ff只对时钟的上升沿敏感的块和总是梳它将在任何时候激活syn_clr变化。怎么syn_clr只是在时钟的上升沿采样,因此是同步的,如果它在总是梳堵塞。

我明白在一个总是_ffblock 赋值是非阻塞的并且发生在块的末尾,但是在这个例子中只有一个赋值所以没问题。

此时,Chu 在书中提到了 FSM 和 FSMD,但并未在本章中正式介绍这些概念。

也许我遗漏了其他东西或我对总是块没有我想象的那么坚固。任何澄清将不胜感激。

【问题讨论】:

    标签: system-verilog sequential flip-flop


    【解决方案1】:

    Chu 所做的声明 syn_clr 仅在上升时检查 时钟的边缘不那么清楚。

    你是对的。这种说法是不准确的。 r_next 是在 clk 的位置采样的,而不是 syn_clr

    第二个代码示例是使用同步清零对简单 DFF 进行建模的正确方法。

    目前尚不清楚为什么作者选择显示第一个示例。

    我的想法是,当syn_clr改变时,always_comb块是 活性

    确实如此,但当d发生变化时,该块也会被激活。更一般地,该块在任何更改时触发任何信号在块内分配的 RHS 上。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多