簡體   English   中英

是否有更好/替代方法來實現 SystemC 模塊中的延遲

[英]Is there a better/alternate way to implement delay in SystemC Modules

我在其 output 端口中實現了一個 4 位加法器。

SC_MODULE(adder4){
  sc_in<sc_uint<4>>   A,B;
  sc_out<sc_uint<4>>  OUT;
  
  sc_event ev;

  sc_uint<4> val_a,val_b,val_s;
  
  void add(){
    val_a = A.read();
    val_b = B.read();
  
    val_s = val_a + val_b;
    ev.notify(2,SC_NS);
  }

  void write(){
    OUT.write(val_s);
    ev.cancel();
  }
  
  SC_CTOR(adder4){
    SC_METHOD(add);
    dont_initialize();
    sensitive<<A<<B;
    
    SC_METHOD(write);
    dont_initialize();
    sensitive<<ev;
  }
};

我的問題是:

  • 有沒有更好的方法來實現方法的延遲?
  • 使用 sc_event 是否有任何直接/間接的缺點?

這是原始答案的編輯版本,在加法器線程中缺少事件依賴項。 此代碼添加了該依賴項。

我猜更好是主觀的,並且總是受制於“在什么標准下更好”。 這是我會使用的另一種方法。 我這樣說是因為它們都被塞進了一堆模板中,但是如果你解開它們,它就會在道德上等同於下面的代碼。

由於我們正在處理時間,我添加了一個系統時鍾和一個驅動模塊來為加法器提供輸入。 我還將信號跟蹤到一個 vcd 文件,這樣我們就可以檢查波形是否有正確的系統時鍾延遲。

#include <systemc.h>

using data_t = sc_uint<4>;
const auto delay = sc_time(2.0, SC_NS);

// Asynchronous adder with output propagation delay
SC_MODULE(adder4){
    sc_in<data_t>   A,B;
    sc_out<data_t>  OUT;

    void add(){

       while(true){
         wait(A.default_event() | B.default_event());
         auto sum = A.read() + B.read();  //calculate sum
         wait(delay);                     //wait delay
         OUT.write(sum);                  //write sum after delay
       }
    }

    SC_CTOR(adder4){
        SC_THREAD(add)  //thread instead of process         
    }
};

SC_MODULE(driver){
    unsigned a,b;                //internal data values
    sc_in<bool> clk_in;          //system clock  input
    sc_out<data_t> out_a, out_b; //driver data outputs

    void proc(){
        out_a.write(a);
        out_b.write(b);

        //change internal data to drive test device. just increment
        a += 1;
        b += 2;
    }
    SC_CTOR(driver){
        a = b = 0;
        SC_METHOD(proc);
        sensitive << clk_in.pos();
        dont_initialize();
    }
};

using signal_t = sc_signal<data_t>;

int sc_main(int, char**){
    sc_clock clk("clk", 5, SC_NS); //system clock
    driver drv("driver");          //test case driver
    adder4 adder("adder");         //device under test

    //connect devices
    signal_t s1, s2, s3;
    drv.clk_in(clk);
    drv.out_a(s1);
    drv.out_b(s2);
    adder.A(s1);
    adder.B(s2);
    adder.OUT(s3);
    
    //trace signals to waveforms.vcd
    sc_trace_file *tf = sc_create_vcd_trace_file("waveforms");
    sc_trace(tf, clk, "clk");
    sc_trace(tf, s1, "A");
    sc_trace(tf, s2, "B");
    sc_trace(tf, s3, "OUT");

    sc_start(40, SC_NS);

    sc_close_vcd_trace_file(tf);

    return 0;
}

執行此操作會生成我在 GTKViewer 中顯示的 vcd 文件“waveforms.vcd”,其圖像如下所示。 可以清楚的看到加法器output延遲了2ns。 這是“最好的”還是“更好的”? 我不能說,但它或多或少是滿足您要求的標准(ish)方法。 至少它滿足了您要求的替代方法的要求。 肯定有無數種方法可以達到相同的結果,但正如我所說,這是一種標准(ish)方法。

GTKViewer 系統 Wavefroms

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM