在给定的周期内只写一次注册?

问题描述

背景

我对各种 bluespec 演示文稿和文档的理解是,如果两个规则都修改一个寄存器,则它们不能在同一周期中运行。

例如,我读过“BSV By Example”(Amazonother),

同样,某些硬件资源限制,例如事实 硬件线只能在每个时钟中用一个值驱动, 将阻止一些规则对在一个时钟中一起执行 因为他们都需要那个资源。我们称之为“规则资源 冲突”。

同样,Arvind @ MIT 似乎say 不允许“双写错误”。

然后

最近我正在阅读课程“8.6 RWires and atomicity”,遇到类似以下的代码

package Tb;
  import FIFO::*;
  // ----------------------------------------------------------------
  // A top-level module connecting the stimulus generator to the DUT
  (* synthesize *)
  module mkTb (Empty);
    FIFO#(int) f <- mkPipelineFIFO; // Instantiate a FIFO (see module def below)
    // ----------------
    // Step 'state' from 1 to 10
    Reg#(int) state <- mkReg (0);
    rule step_state;
      if (state > 9) $finish (0);
      state <= state + 1;
    endrule
    // ----------------
    // Enqueue and dequeue something on every cycle (in every state)
    rule e;
      let x = state * 10;
      f.enq (x);
      $display ("State %0d: Enqueue %0d",state,x);
    endrule
    rule d;
      let y = f.first ();
      f.deq ();
      $display ("State %0d: Dequeue %0d",y);
    endrule
    // ----------------
    // Also clear the FIFO in state 2
    rule clear_counter (state == 2);
      f.clear ();
      $display ("State %0d: Clearing",state);
    endrule
  endmodule: mkTb
  // ----------------------------------------------------------------
  // A 1-element "pipeline" FIFO
  (* synthesize *)
  module mkPipelineFIFO (FIFO#(int));
    // STATE ----------------
    // The FIFO
    Reg#(Bool) full <- mkReg (False);
    Reg#(int) data <- mkRegU;
    RWire#(int) rw_enq <- mkRWire; // enq method signal
    pulseWire pw_deq <- mkpulseWire; // deq method signal
    Bool enq_ok = ((! full) || pw_deq);
    Bool deq_ok = full;
    // RULES ----------------
    // This rule does all the work,taking into account that 'enq()' and
    // 'deq()' may be called simultaneously when the FIFO is already full
    rule rule_update_final (isValid(rw_enq.wget) || pw_deq);
      full <= isValid(rw_enq.wget);
      data <= fromMaybe (?,rw_enq.wget);
      $display("rule_update_final");
    endrule
    // INTERFACE ----------------
    method Action enq(v) if (enq_ok);
      rw_enq.wset(v);
    endmethod
    method Action deq() if (deq_ok);
      pw_deq.send ();
    endmethod
    method first() if (full);
      return data;
    endmethod
    method Action clear();
      full <= False;
    endmethod
  endmodule: mkPipelineFIFO
endpackage: Tb

运行此代码导致:

State 0: Enqueue 0
rule_update_final
State 1: Dequeue 0
State 1: Enqueue 10
rule_update_final
State 2: Dequeue 10
State 2: Enqueue 20
State 2: Clearing
rule_update_final
State 3: Dequeue 20
State 3: Enqueue 30
rule_update_final
State 4: Dequeue 30
State 4: Enqueue 40
rule_update_final
State 5: Dequeue 40
State 5: Enqueue 50
rule_update_final
State 6: Dequeue 50
State 6: Enqueue 60
rule_update_final
State 7: Dequeue 60
State 7: Enqueue 70
rule_update_final
State 8: Dequeue 70
State 8: Enqueue 80
rule_update_final
State 9: Dequeue 80
State 9: Enqueue 90
rule_update_final
State 10: Dequeue 90
State 10: Enqueue 100

我相信以下警告(不是错误!)消息似乎是相关的:

Warning: "Tb.bsv",line 38,column 10: (G0117)
  Rule `rule_update_final' shadows the effects of `clear' when they execute in
  the same clock cycle. Affected method calls:
    full.write
  To silence this warning,use the `-no-warn-action-shadowing' flag.

问题

修改一个 rule_update_final 寄存器的两个规则(clear_counterfull)怎么可能在同一个周期内运行?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)