[英]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;
}
};
我的問題是:
這是原始答案的編輯版本,在加法器線程中缺少事件依賴項。 此代碼添加了該依賴項。
我猜更好是主觀的,並且總是受制於“在什么標准下更好”。 這是我會使用的另一種方法。 我這樣說是因為它們都被塞進了一堆模板中,但是如果你解開它們,它就會在道德上等同於下面的代碼。
由於我們正在處理時間,我添加了一個系統時鍾和一個驅動模塊來為加法器提供輸入。 我還將信號跟蹤到一個 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)方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.