版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,系統(tǒng)級(jí)設(shè)計(jì)描述語言SystemC,徐寧儀xuny97@mails.tsinghua.edu.cnXuny @ smth東主樓9區(qū)324房間62781914,版權(quán)所有 2004,第二部分 SystemC的基本語法,教材:陳曦 徐寧儀《SystemC片上系統(tǒng)設(shè)計(jì)》,科學(xué)出版社,2003本課件大部分內(nèi)容參考此書,僅作為大學(xué)教學(xué)之用, 請(qǐng)勿用于商業(yè),2,課程主要內(nèi)容,共講4次,爭取講清楚Why,What &How。,內(nèi)容
2、包括:為什么用SystemC做片上系統(tǒng)設(shè)計(jì)?SystemC基本語法*SystemC行為建?;A(chǔ)*SystemC交易級(jí)建模與通信細(xì)化*SystemC 方法庫Master/Slave庫驗(yàn)證庫,3,第二部分,SystemC的基本語法,4,,目的掌握基本語法語義了解SystmeC的語言架構(gòu)了解SystemC的語言能力編程中容易出現(xiàn)的錯(cuò)誤養(yǎng)成良好的編程習(xí)慣,5,內(nèi)容,1 一個(gè)“Hello,SystemC”實(shí)例SC_MAI
3、N()和全局函數(shù)2 一個(gè)2輸入與非門組合邏輯實(shí)例SystemC的仿真過程與時(shí)間模型3 語法模塊端口和信號(hào)時(shí)鐘和時(shí)間模型數(shù)據(jù)類型進(jìn)程4 仿真和波形跟蹤5 寄存器傳輸級(jí)SystemC設(shè)計(jì)簡介,6,1 一個(gè)“Hello,SystemC”實(shí)例,輸出“Hello,SystemC”、SystemC版本信息 、SystemC版權(quán)聲明、當(dāng)前仿真時(shí)間、SystemC缺省時(shí)間單位和時(shí)間分辨率。包括一個(gè)模塊Hello和sc_main函數(shù)
4、。,7,1 一個(gè)“Hello,SystemC”實(shí)例,//頭文件// hello.h#ifndef _HELLO_H //基本C++#define _HELLO_H#include “systemc.h” //所有SystemC模塊必須包含“systemc.h”#endif,SC_MODULE(hello){ //此處聲明SystemC模塊};,SC_CTOR(hello){ //此
5、處聲明SystemC構(gòu)造函數(shù)cout<<“Hello,SystemC!”<<endl; //輸出“Hello, SystemC!”cout<<“sc_version():”<<endl; cout<<sc_version()<<endl; //輸出SystemC版本cout<<“sc_copyright():”<<endl;
6、 cout<<sc_copyright()<<endl; //輸出版權(quán)聲明cout<<"sc_time_stamp():"<<sc_time_stamp()<<endl;cout<<"sc_get_time_resolution():"<<sc_get_time_resolution()<<e
7、ndl;cout<<"sc_get_default_time_unit():"<<sc_get_default_time_unit()<<endl;},8,1 一個(gè)“Hello,SystemC”實(shí)例,sc_main函數(shù)運(yùn)行結(jié)果,// 主文件// main.cpp#include "hello.h"int sc_main(int i,
8、 char* av[ ]){ hello h(“hello””); //實(shí)例化模塊 return 0;},9,1 運(yùn)行結(jié)果,10,從本例得出的結(jié)論,SystemC的缺省時(shí)間單位為ns,缺省的時(shí)間分辨率為1ps,用Verilog HDL可以描述為 `timescale 1 ns/1 ps,SystemC中的模塊用SC_MODULE(module_name) {…}來聲明,等
9、效于VHDL的entity。,SystemC的一個(gè)模塊實(shí)際上是一個(gè)類,所以它有構(gòu)造函數(shù)和析構(gòu)函數(shù)。,SystemC的最頂層函數(shù)是sc_main。既然SystemC是C++,為什么不用main()?,11,main() & sc_main(),所有的C/C++的代碼的入口是main()。,SystemC也不例外。但main()函數(shù)是SystemC核心語言庫的一部分,它調(diào)用sc_main(),所以SystemC用戶代碼的入口函數(shù)是s
10、c_main()。Return 0代表正常返回。,如果SystemC庫中的main()函數(shù)不能滿足我們的要求,我們可以修改這個(gè)函數(shù) 。,int sc_main(int i, char* av[ ])的兩個(gè)參數(shù)中,前面一個(gè)表示參數(shù)的數(shù)目,后面一個(gè)是用字符串表示的參數(shù)的值,這與C語言的main()函數(shù)的參數(shù)的意義一樣。,12,SystemC的全局函數(shù),全局函數(shù)是在幾乎任意位置的用戶代碼處使用的函數(shù)。,sc_version()、sc_copy
11、right()。T sc_abs(const T& val)返回實(shí)參的絕對(duì)值 (模板函數(shù))。T sc_max( const T& a,const T& b)返回a、b中較大的一個(gè), sc_min類似。sc_start()開始運(yùn)行仿真核;sc_stop()停止運(yùn)行。,13,內(nèi)容,1 “Hello,SystemC”實(shí)例SC_MAIN()和全局函數(shù)2 組合邏輯實(shí)例 - 2輸入與非門SystemC的仿真過程
12、與時(shí)間模型3 語法模塊端口和信號(hào)時(shí)鐘和時(shí)間模型數(shù)據(jù)類型進(jìn)程4 仿真和波形跟蹤5 寄存器傳輸級(jí)SystemC設(shè)計(jì)簡介,14,組合邏輯實(shí)例 - 2輸入與非門,本例目的學(xué)習(xí)如何使用Visual C++6.0建一個(gè)SystemC項(xiàng)目以及如何用ModelSim查看波形。初步了解SystemC的仿真語義,也就是仿真執(zhí)行過程。,,SC_MAIN,15,Nand2模塊,// A SystemC description of 2-in
13、put nand gate Designed By Chenxi,2003.3.22.#include #include SC_MODULE(nand2){sc_in A,B;sc_out F;void do_nand(){ F=!( A & B); };SC_CTOR(nand2){ SC_METHOD(do_nand);//聲明do_nand為進(jìn)程 sensitive<<A<&
14、lt;B; } //這里是do_nand進(jìn)程的敏感表};,16,Nand2模塊的驗(yàn)證程序(Testbench),#ifndef _TB_H#define _TB_H#include “systemc.h”SC_MODULE(tb){ sc_out a,b; sc_in f; sc_in_clk clk; void gen_input(); void display_variabl
15、e();SC_CTOR(tb){ SC_CTHREAD(gen_input, clk.pos()); SC_METHOD(display_variable);sensitive<<f<<a<<b; dont_initialize(); }};#endif;,17,Nand2模塊的驗(yàn)證程序(Testbench),#include “tb.h”void tb::gen
16、_input(){ wait(); a=0; b=0; wait(); a=0; b=1; wait(); a=1; b=0; wait(); a=1; b=1; wait(); a=0; b=0; wait(); a=0; b=0;},void tb::display_variable(){cout<&l
17、t;"a="<<a<<",b="<<b<<",f="<<f<<endl; },,18,Nand2項(xiàng)目的sc_main()函數(shù),#include "nand2.h“#include "tb.h"int sc_main(int, char**){ sc_signal
18、a, b, f; sc_clock clk("Clk",20,SC_NS); nand2 N2("Nand2"); N2.A(a); N2.B(b); N2.F(f); tb tb1("tb"); tb1.clk(clk); tb1.a(a); tb1.b(b); tb1.f(f); //
19、 trace file creation sc_trace_file *tf = sc_create_vcd_trace_file("Nand2"); sc_trace(tf,N2.A, "A"); sc_trace(tf,N2.B, "B"); sc_trace(tf,N2.F, "F"); sc_start(20
20、0); sc_close_vcd_trace_file(tf);//Never forget this function return 0; },Go to Scheduler,19,SystemC安裝 – 以MSVC6.0為例,下載SystemC庫http://www.systemc.orgftp://166.111.172.77/incoming/各種講義專用目錄/本系/研究生課程/SystemC-周祖成-20
21、04秋/SystemCLib解壓縮C:\temp\ systemc-2.0.1\打開項(xiàng)目文件C:\temp\systemc-2.0.1\msvc60\systemc\systemc.dsw創(chuàng)建Build->Build systemclib (F7),20,Nand2,Create new projectFile->New->Project->win32 Console application -&g
22、t; empty projectAdd existed filesProject->Add to Project -> Filesmain.cpp tb.h nand2.hBuilding argument and dependencyproject->settings->C/C++->c++ language->Enable runtime informationproject->
23、settings->C/C++->preprocessor->additional include directory-> C:\temp\systemc-2.0.1\srcAdd Systemc.lib: project->add to project->files-> C:\temp\systemc-2.0.1\msvc60\systemc\debug\systemc.libBuild,
24、 Run,21,用ModeSim查看波形,建一個(gè)ModelSim項(xiàng)目,將Nand2.vcd復(fù)制到該項(xiàng)目的目錄下。使用ModelSim行命令vcd2wlf 將VCD文件轉(zhuǎn)化為WLF文件。命令格式為: vcd2wlf ,這里我們輸入: vcd2wlf Nand2.vcd Nand2.wlf。請(qǐng)注意vcd2wlf與Nand2.vcd、Nand2.vc與Nand2.wlf之間都有空格。如果沒
25、有任何提示,則命令被正確執(zhí)行,這時(shí)將產(chǎn)生一個(gè)Nand2.wlf文件。,22,用ModeSim查看波形,打開signal、structure和wave窗口。,在wave窗口下選擇Open dataset菜單,將生成的Nand2.wlf文件導(dǎo)入進(jìn)來。這時(shí)你將在structure窗口中看到設(shè)計(jì)SystemC:,在signal窗口中選擇所要看的信號(hào)放到wave窗口中你就可以看到波形了。,23,特別強(qiáng)調(diào),所有的支持標(biāo)準(zhǔn)C++的編譯器都可以編譯Sy
26、stemC。為了方便PC上的使用,我們使用Visual C++ 6.0編譯器。,可以使用ModelSim、 WaveViewer、VCS、SignalScan等查看波形。 WaveViewer是免費(fèi)的,直接可以查看vcd文件記錄的波形。,24,SystemC仿真過程,SystemC可執(zhí)行文件的執(zhí)行(Execution)過程分為目標(biāo)描述(Elaboration)、初始化(Initialization)和仿真(Simulation)三個(gè)階段
27、。,SystemC的仿真過程是基于事件(Event)的。仿真時(shí)間只前進(jìn),不后退。前進(jìn)的尺度與仿真時(shí)間分辨率和時(shí)間單位有關(guān)。,25,目標(biāo)描述(Elaboration)階段,從sc_main()到sc_start()的第一次執(zhí)行。sc_main(int,char**){//Elaboration starts here ……; sc_start(1000); //Elaboration ends here……;},
28、Elaboration部分一般包括:模塊實(shí)例和連接模塊的通道的初始化、設(shè)置缺省時(shí)間單位和仿真分辨率、sc_clock的初始化、sc_time類型數(shù)據(jù)的初始化。,SystemC不支持模塊的動(dòng)態(tài)創(chuàng)建。(SystemC模塊等效于VHDL的Entity),26,初始化(Initialization)階段,整個(gè)SystemC仿真的執(zhí)行過程由SystemC調(diào)度器控制,Initialization是SystemC調(diào)度器執(zhí)行的第一步。,SystemC核
29、心語言庫定義了三種進(jìn)程: SC_METHOD、SC_THREAD和SC_CTHREAD。在初始化階段,缺省情況下每一個(gè)進(jìn)程都被執(zhí)行一次,THREAD進(jìn)程被執(zhí)行到第一個(gè)wait()語句。,通過don’t_initialize( )函數(shù)可以關(guān)閉對(duì)進(jìn)程的初始化。當(dāng)進(jìn)程的敏感表上有事件發(fā)生的時(shí)候,沒有初始化的進(jìn)程的第一條語句才開始執(zhí)行。,27,初始化(Initialization)階段 con’t,在初始化階段,進(jìn)程的初始化順序是不確定的。但不
30、同次執(zhí)行中進(jìn)程的初始化順序是確定的。所以同一設(shè)計(jì)用不同的編譯器得到的可執(zhí)行文件由于初始化順序不同可能產(chǎn)生不同的運(yùn)行結(jié)果??聪马摰睦樱?28,初始化(Initialization)階段 con’t,上述代碼中第一次顯示的addr的值是0還是1?,SC_MODULE(Example){sc_in_clk clk;sc_uint last_addr(0); sc_uint addr(0); void inc(){ while(
31、true) {addr=last_addr+1;wait();} }void display(){ cout<<“At time : ”<<sc_time_stamp(); cout<<“, addr changed to:”<<addr<<endl; }SC_CTOR(Example){ SC_THREAD(inc); sensitive_p
32、os<<clk; SC_METHOD(display); sensitive<<addr;} },都有可能!,29,初始化(Initialization)階段 con’t,在Verilog HDL中的初始化過程(Initial語句)存在同樣的問題。(此頁的目的是說明初始化中的不確定問題并不只是存在于SystemC,實(shí)際代碼編寫過程中應(yīng)避免不確定性) module example inte
33、ger last_addr; wire [31:0] addr; assign addr=last_addr+1; initial begin last_addr=0;$display(“At time : ”,$time, “;the addr changed to: %d”,addr); end endmodule,30,初始化(Initialization)階段 con’t,上
34、面代碼中到底是賦值先執(zhí)行還是$display先執(zhí)行?都有可能。在默認(rèn)選項(xiàng)下在Verilog-XL顯示的addr值為x(仿真命令為verilog example.v)。VCS中的結(jié)果為1(仿真命令為vcs –o example.out example.v,然后執(zhí)行example.out)。仿真結(jié)果是不同的!原因是Verilog-XL是執(zhí)行完整個(gè)initial語句后才對(duì)addr賦值,而vcs是在last_addr被賦值后中斷initi
35、al語句,在執(zhí)行完對(duì)addr賦值后返回initial。有趣的是如果將上例中第三和第四行合并為wire addr=last_addr+1,則仿真結(jié)果就會(huì)相同!,31,仿真(Simulation)階段,Simulation階段從第一次遇到sc_start( )開始到預(yù)先設(shè)定的仿真時(shí)間結(jié)束或者遇到sc_stop()。,預(yù)先設(shè)定的仿真時(shí)間由sc_start()確定。如: SC_MODULE(Example){ ……
36、 sc_start(500); …… } 如果缺省的時(shí)間單位為ns且代碼中沒有使用sc_stop(),則仿真進(jìn)行500ns。,32,仿真(Simulation)階段,如果sc_start()的參數(shù)為空,則仿真進(jìn)行到遇到sc_stop()。,練習(xí):對(duì)照Nand2的例子分析仿真過程中的這三個(gè)仿真階段,33,,sc_start()函數(shù)激活SystemC調(diào)度器開始運(yùn)行。,對(duì)進(jìn)程的初始化是SystemC調(diào)度器的第一個(gè)工作。
37、,SystemC調(diào)度器控制仿真時(shí)序、進(jìn)程的執(zhí)行順序、處理仿真過程中的事件和更新信號(hào)的值,SystemC調(diào)度器也是基于Delta周期的。一個(gè)Delta周期包括求值和更新兩個(gè)階段。Delta周期是重要的概念,在VHDL中已經(jīng)講過,這里不詳述。,SystemC調(diào)度器,34,內(nèi)容,1 “Hello,SystemC”實(shí)例SC_MAIN()和全局函數(shù)2 組合邏輯實(shí)例 - 2輸入與非門SystemC的仿真過程與時(shí)間模型3 語法模塊端口和信
38、號(hào)時(shí)鐘和時(shí)間模型數(shù)據(jù)類型進(jìn)程4 仿真和波形跟蹤5 寄存器傳輸級(jí)SystemC設(shè)計(jì)簡介,35,SystemC的模塊,模塊是SystemC中是設(shè)計(jì)的最基本的單位,可以將模塊理解為完成一個(gè)特定功能的基本單元。,SystemC中的模塊相當(dāng)于Verilog HDL的module或者VHDL的entity。,一個(gè)模塊可以包含一些其它的SystemC基本元素如端口、內(nèi)部信號(hào)、內(nèi)部數(shù)據(jù)、子模塊、進(jìn)程、構(gòu)造函數(shù)和析構(gòu)函數(shù)等。這些元素共同定義模塊
39、所表達(dá)的功能。,36,SystemC模塊的定義,模塊使用SystemC中的關(guān)鍵字SC_MODULE來聲明,如下例所示: //the direct memory access controller for ARM SC_MODULE(DMA) {……//Details of the design},SC_MODULE是SystemC庫中定義的一個(gè)宏,使用它定義一個(gè)模塊實(shí)際上是定義
40、了一個(gè)新的C++類。,37,SystemC模塊的定義con’t,還可以直接用C++類的定義方法來定義模塊。舉例如下: //the direct memory access controller for ARMclass DMA :public sc_module { ……//Port Declaration SC_HAS_PROCESS(DMA); ……//Other details of the desi
41、gn };,38,SystemC模塊的定義con’t,在C++中,struct是一個(gè)特殊的類,所以也可以利用struct來定義一個(gè)模塊。舉例如下: //the direct memory access controller for ARM struct DMA :public sc_module { ……//Details of the design };,39,模塊的端口,模塊的端口使數(shù)據(jù)能夠在模
42、塊間通過,模塊之間通過信號(hào)將端口連接起來。端口分為in、out和inout三種類型,如果需要將某一個(gè)端口的數(shù)據(jù)賦給模塊自身的其它信號(hào),那么該端口就應(yīng)該是inout類型(與VHDL類似),你也可以指定端口的數(shù)據(jù)類型,允許的數(shù)據(jù)類型包括C++基本數(shù)據(jù)類型如bool、int、short、char等或者是SystemC專有數(shù)據(jù)類型如sc_int、sc_unit、sc_logic等或用戶定義的任何數(shù)據(jù)類型。,40,端口的實(shí)例,#define MA
43、X 1514struct packet{char[6] source_address;char[6] destination_address;int length;char data[MAX];}下面的代碼就定義了一個(gè)輸入端口,端口的數(shù)據(jù)類型就是packet。 sc_in pkt_in;,41,一個(gè)FIFO的端口定義,sc_in_clk clk;
44、 //clock sc_in rst; //reset sc_in wr_en; //FIFO write enable sc_in rd_en; //FIFO read enable sc_in
45、din; //data input ,32 bit bus sc_out full,almost_full; sc_out empty,almost_empty; sc_out data_count; //FIFO data count sc_out dout; /
46、/FIFO data out,42,向量型端口和信號(hào),有時(shí)候需要聲明一個(gè)端口向量,如計(jì)算機(jī)的數(shù)據(jù)和地址總線,這在SystemC中也是允許的,舉例如下:sc_in a[32];,這句代碼聲明了a[0]到a[31]這32個(gè)端口,端口方向?yàn)檩斎?,端口?shù)據(jù)類型為sc_logic。信號(hào)(見后面的頁)也可以使用類似的辦法聲明: sc_signal abus[16];,上面這句代碼聲明了a[0]到a[15]這16個(gè)信號(hào),信號(hào)類型為sc_
47、logic。,43,抽象端口,SystemC為了支持交易級(jí)建模,還支持抽象端口。假設(shè)接口direct_if的定義如下:class direct_if : public virtual sc_interface{public: // direct BUS/Slave interface virtual bool direct_read(int *data, unsigned int address) = 0; vir
48、tual bool direct_write(int *data, unsigned int address) = 0; }; // end class direct_if 那么下面的代碼定義了一個(gè)抽象端口: sc_port arbiter_port; 讀者可能希望更好的理解抽象端口和接口,參見SystemC行為建模部分,44,端口和信號(hào)的讀寫,在SystemC中端口
49、的讀寫可以是與VHDL/Verilog HDL一樣的賦值。如果定義了sc_in data_in; 那么在進(jìn)程中可以進(jìn)行下面的讀操作:if(data_in==TRUE) {……} bool flag=data_in;,45,端口和信號(hào)的讀寫con’t,另外在SystemC中對(duì)端口還定義了read()和write()助手函數(shù)以幫助完成可能需要的隱式類型轉(zhuǎn)換。上面的代碼也可以寫成如下格式:sc_out data
50、_out;……if(data_in.read()==TRUE) {……}if(data_in.read()==1) {……} bool flag=data_in.read();data_out.write(10);data_out.write(data_in.read());,46,端口和信號(hào)的讀寫con’t,對(duì)于需要隱式類型轉(zhuǎn)換的場合,只能是用助手函數(shù)read()和write()進(jìn)行讀寫操作。如上面例子中data_out
51、.write(data_in.read())是允許的,而直接賦值data_out=data_in就是非法的,因?yàn)閮烧哳愋筒煌?。前者是int型,后者是bool型,編譯器不知道重載哪一個(gè)函數(shù)。,所以:推薦使用read()和write()進(jìn)行端口的讀寫操作。,47,端口和信號(hào)的多驅(qū)動(dòng)處理,下圖中result的值應(yīng)該為什么?,答案:result=x,48,端口和信號(hào)的多驅(qū)動(dòng)處理con’t,SystemC的邏輯值解析表,49,端口和信號(hào)的多驅(qū)動(dòng)處
52、理con’t,普通的信號(hào)是不允許多驅(qū)動(dòng)的。SystemC中引入了解析邏輯向量信號(hào)(Resolved Logic Vector signal)來解決多驅(qū)動(dòng)的問題。可以使用下面的方法定義解析型端口:sc_in_rv x; //x被定義為n比特寬的解析邏輯向量型輸入端口sc_out_rv y; //y被定義為n比特寬的解析邏輯向量型輸出輸出端口sc_inout_rv z; //z被定義為n比特寬的解析邏輯向量型雙向端口 這里
53、n是任意正值。,類似的,解析型信號(hào)的定義方法如下: sc_signal_rv x; //寬度為n比特的解析型向量信號(hào)x。,50,一個(gè)多驅(qū)動(dòng)的例子——2選1的三態(tài)門,方框圖如下:,51,一個(gè)多驅(qū)動(dòng)的例子——2選1的三態(tài)con’t,SC_MODULE(Tristate) { sc_in in_sela, in_selb; sc_in in_a; sc_in in_b; sc_out_rv out_1;// Me
54、thod for first three-state driver void tristate_a();// Method for second three-state driver void tristate_b();// ConstructorSC_CTOR( Tristate) { SC_METHOD( tristate_a); sensitive << in_sela << in_a
55、; SC_METHOD( tristate_b); sensitive << in_selb << in_b;}};,52,信號(hào)和變量,信號(hào)不能用in,out或inout來聲明,信號(hào)的傳輸方向取決于連接部分的端口狀態(tài) 。,信號(hào)的定義方法: sc_signal signal_name;,如:sc_signal a; sc_signal> > data_bus;,SystemC中信號(hào)與變量
56、的區(qū)別與VHDL中一樣。信號(hào)常被用來連接模塊和用于進(jìn)程間通信,變量則用于進(jìn)程和模塊的本地存儲(chǔ)。變量仿真的賦值是立刻發(fā)生的,沒有delta延時(shí).而信號(hào)和端口的值刷新要經(jīng)過一個(gè)delta延時(shí).,變量的定義與標(biāo)準(zhǔn)C++是一樣的。,按照上面的說法,信號(hào)應(yīng)常被綜合為邏輯塊間的連線。變量常被綜合為邏輯塊,可以是組合或者時(shí)序邏輯。,53,信號(hào)和端口的關(guān)聯(lián),關(guān)聯(lián)(Association)基本等于連接(Connect),也稱為綁定(Bind),關(guān)聯(lián)(A
57、ssociation)分為位置關(guān)聯(lián)和名字關(guān)聯(lián),與VHDL一樣。名字關(guān)聯(lián)就是按照名字一一對(duì)應(yīng);位置關(guān)聯(lián)就是按照端口定義的順序一一對(duì)應(yīng)。,54,名字關(guān)聯(lián)實(shí)例,#include "nand2.h"#include "tb.h"int sc_main(int, char**){ sc_signal a,b,f; sc_clock clk("Clk",20,SC_NS);
58、 nand2 N2("Nand2"); N2.A(a); N2.B(b); N2.F(f); tb tb1("tb"); tb1.clk(clk); tb1.a(a); tb1.b(b); tb1.f(f); ……//Rest of the code omitted return 0; },55,位置關(guān)聯(lián)實(shí)例,#i
59、nclude "nand2.h"#include "tb.h"int sc_main(int, char**){ sc_signal a,b,f; sc_clock clk("Clk", 20, SC_NS); nand2 N2("Nand2"); N2(a,b,f); tb tb1("tb");
60、 tb1(clk, a, b ,f); ……//Rest of the code omitted return 0; },56,兩種關(guān)聯(lián)方式的對(duì)比,位置關(guān)聯(lián)在一個(gè)只有少量端口的模塊的初始化中是非常合適的,它能夠使描述簡單化。,然而在對(duì)一個(gè)有大量端口的模塊的初始化中使用位置關(guān)聯(lián)將是非常危險(xiǎn)的,因?yàn)閷?shí)際工作中設(shè)計(jì)者可能會(huì)不經(jīng)意間修改了模塊的端口的順序,這時(shí)就會(huì)產(chǎn)生關(guān)聯(lián)錯(cuò)誤,而這種錯(cuò)誤很可能是很難發(fā)現(xiàn)的。遇到這種情
61、況最好使用下文所述的名字關(guān)聯(lián)。,所以對(duì)于一個(gè)大的SystemC項(xiàng)目,一般建議統(tǒng)一的使用名字關(guān)聯(lián)。,57,模塊的構(gòu)造函數(shù),C++中的構(gòu)造函數(shù)創(chuàng)建模塊內(nèi)部數(shù)據(jù)結(jié)構(gòu),并把這些數(shù)據(jù)結(jié)構(gòu)初始化為已知的值 。,SystemC構(gòu)造函數(shù)還用于初始化進(jìn)程的類型并創(chuàng)建進(jìn)程的敏感表。,SystemC的構(gòu)造函數(shù)用SC_CTOR標(biāo)識(shí),構(gòu)造函數(shù)的名字必須與模塊的名字相同。,58,一個(gè)構(gòu)造函數(shù)的實(shí)例,// A SystemC description of 2-inp
62、ut nand gate Designed By Chenxi,2003.3.22.#include #include SC_MODULE(nand2){sc_in A,B;sc_out F;void do_nand(){ F=!( A & B); };SC_CTOR(nand2){ SC_METHOD(do_nand);//聲明do_nand為SC_METHOD進(jìn)程 sensitive<<A&
63、lt;<B; } //這里是do_nand進(jìn)程的敏感表};,59,另外一個(gè)構(gòu)造函數(shù)的例子,#include //Other includesSC_MODULE(simple_soc){ CPU *cpu1; MemoryUnit *mu1; GPIO *gpio1; DMA *dma1; ……//declare c
64、lock and //other singals //Constructor SC_CTOR(simple_soc){……//See next slide} ~simple_soc(){……}//Destructor},60,另外一個(gè)構(gòu)造函數(shù)的例子con’t,simple_soc的構(gòu)造函數(shù)如下:,SC_CTOR(simple_soc){ cpu1 = new CPU("CPU");
65、 ……//connect ports mu1 = new MemoryUnit("MU"); …… //connect ports gpio1= new GPIO("GPIO"); …… //connect ports dma1 = new DMA("DMA"); …… //connect ports},61,在構(gòu)造函數(shù)中對(duì)端口的初始化方法
66、,SC_MODULE(Tb){ sc_out data_source; //Other port declarations bool value; void GenInput(){data_source.write(value);value= !value;}; SC_CTOR(Tb){SC_METHOD(GenInput);sensitive_pos<<clk;data_sou
67、rce.write(TRUE);//Wrong! data_source = TRUE;//Wrong! data_source.initialize(true);//OK!value=TRUE;//Ok! }; }; (Int2BoolTest.dsw),62,析構(gòu)函數(shù),析構(gòu)函數(shù)釋放代碼中申請(qǐng)的內(nèi)存simple_soc的析構(gòu)函數(shù)如下:,//Destructor ~s
68、imple_soc(){ if(cpu1) {delete cpu1; cpu1 =0;} if(mu1) {delete mu1; mu1 =0;} if(gpio1){delete gpio1;gpio1=0;} if(dma1) {delete dma1; dma1 =0;} },63,SystemC時(shí)鐘模型,在SystemC中,時(shí)鐘被作為一個(gè)特殊的對(duì)象處理,它就是sc_clock類。,時(shí)鐘端口作為一個(gè)特殊
69、的端口。如:sc_in_clk clk1;//可以用sc_in clk1代替,在SystemC2.0.1中,sc_clock一共有6個(gè)重載的構(gòu)造函數(shù) 。如: sc_clock( sc_module_name name_, const sc_time& period_, double duty_cycle_ = 0.5,
70、 const sc_time& start_time_ = SC_ZERO_TIME, bool posedge_first_ = true );,64,SystemC時(shí)鐘定義實(shí)例1,sc_clock clk1("clk1", 20, 0.5, 5, true);,65,SystemC時(shí)鐘定義實(shí)例2,sc_clock clk2("clk2", 20,
71、0.5, 0, true);,66,以上兩例的缺點(diǎn),在clk1和clk2的定義中,沒有給出時(shí)鐘的具體時(shí)間單位,系統(tǒng)默認(rèn)的時(shí)間單位將被采用,不同的系統(tǒng)的默認(rèn)時(shí)間單位可能不同,這將不利于IP核的設(shè)計(jì)復(fù)用。假設(shè)clk1的周期為50MHz,則更合適的定義方法為: sc_clock clk1("clk1", 20, SC_NS, 0.5, 5, SC_NS, true);,67,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- verilog硬件描述語言課程設(shè)計(jì)
- 通用安全事件描述語言的設(shè)計(jì).pdf
- 基于語義網(wǎng)描述語言的信息檢索系統(tǒng).pdf
- 教學(xué)大綱-fpga及硬件描述語言
- 課程名稱fpga與硬件描述語言
- 服裝描述語
- 服裝描述語
- 動(dòng)畫自動(dòng)生成系統(tǒng)中規(guī)范描述語言設(shè)計(jì)與集成環(huán)境構(gòu)建.pdf
- 硬件描述語言的哲學(xué)分析.pdf
- 面向網(wǎng)格計(jì)算的描述語言研究.pdf
- 基因調(diào)控網(wǎng)絡(luò)模型描述語言研究.pdf
- 通用指令集描述語言的設(shè)計(jì)和實(shí)現(xiàn).pdf
- 權(quán)利描述語言的學(xué)習(xí)研究及其驗(yàn)證系統(tǒng)的實(shí)現(xiàn).pdf
- 基于XML數(shù)據(jù)模式的構(gòu)架描述語言.pdf
- XrML權(quán)利描述語言邏輯實(shí)施機(jī)制研究.pdf
- 畢業(yè)設(shè)計(jì)---基于硬件描述語言vhdl的電子鐘設(shè)計(jì)
- 軟件體系結(jié)構(gòu)描述語言CCJava的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 通用構(gòu)架描述語言的研究與實(shí)現(xiàn).pdf
- 包包服裝描述語
- 基于中間件可信構(gòu)件描述語言設(shè)計(jì)與實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論