SystemC 專用數據類型是為適配硬件建模需求設計的,支持多值邏輯、靈活位寬控制、定點運算等硬件特有特性,主要集中在書中第三章 “Data Types” ,同時與端口、信號等組件的類型聲明緊密關聯,以下按類型分類梳理核心內容:
一、邏輯向量類型(Logic Vector Types)
此類類型用於建模硬件中的位信號,分為2 值邏輯(僅 0、1)和4 值邏輯(0、1、X - 未知、Z - 高阻),支持位級操作(選擇、範圍截取、縮減運算)。
- sc_bv<W>(Bit Vector) sc_bv<BITWIDTH> NAME…;
- 2 值位向量,位寬由模板參數
W指定(如sc_bv<8>表示 8 位),僅支持 0、1 兩種值,無多值邏輯特性。 - 核心操作:按位操作(&、|、~),位選擇(
[],如bv[0]取最低位)、範圍選擇(range(high, low),如bv.range(3,0)取低 4 位)、縮減運算(and_reduce()、or_reduce()等,對所有位執行邏輯運算並返回 1 位結果)。 - 適用場景:無需多值邏輯的純數字信號建模,如控制總線、地址線。
- sc_lv<W>(Logic Vector)(相比sc_bv運行開銷大,滿得多)
- 4 值邏輯向量,位寬由
W指定,支持 0、1、X(未知)、Z(高阻),兼容硬件中的不確定狀態和三態總線。 - 操作與
sc_bv<W>一致,但需注意多值邏輯的運算規則(如 X 與任何值運算仍為 X)。 - 適用場景:需要表示未知或高阻狀態的信號,如總線競爭、未初始化信號。
- sc_logic(Single-Bit Logic)(相比sc_bv運行開銷大,滿得多)
- 單比特 4 值邏輯類型,取值為
SC_LOGIC_0(0)、SC_LOGIC_1(1)、SC_LOGIC_X(未知)、SC_LOGIC_Z(高阻),是sc_lv<1>的單比特版本。 - 注意:早期的
sc_bit(單比特 2 值類型)已被 IEEE 1666 標準廢棄,建議用 C++ 原生bool替代。
二、整數類型(Integer Types)
針對硬件中 “固定位寬整數” 的建模需求,提供不同精度的有符號 / 無符號整數,支持算術運算和位操作,彌補原生 C++ 整數位寬依賴平台的缺陷。
- sc_int<W> / sc_uint<W>(Limited-Precision Integers)
- 有符號(
sc_int<W>)/ 無符號(sc_uint<W>)整數,位寬W範圍為 1~64 位,內部映射到處理器原生指令,仿真速度快。 - 核心特性:支持加減乘除、移位、位與 / 或 / 異或等算術和位操作,可與原生 C++ 整數(如
int)混合賦值(自動類型轉換)。 - 適用場景:64 位以內的硬件整數建模,如計數器、寄存器。
- sc_bigint<W> / sc_biguint<W>(Arbitrary-Precision Integers)
- 任意位寬的有符號 / 無符號整數,
W可超過 64 位(如sc_bigint<128>表示 128 位有符號整數),但仿真速度慢於sc_int<W>。 - 適用場景:超過 64 位的大整數建模,如加密算法、高精度計數器。
三、定點數類型(Fixed-Point Types)
專為數字信號處理(DSP)等需要小數建模的場景設計,支持自定義整數 / 小數部分位寬、溢出模式和量化模式,需通過SC_INCLUDE_FX宏啓用。
- 編譯時配置類型(Compile-Time Configurable)
sc_fixed<WL, IWL>:有符號定點數,WL(總位寬)、IWL(整數部分位寬)為編譯時常量,如sc_fixed<5,3>表示總位寬 5 位,整數部分 3 位(取值範圍 - 4.0~3.75)。sc_ufixed<WL, IWL>:無符號編譯時定點數,無負數值範圍。fast版本(sc_fixed_fast<WL,IWL>、sc_ufixed_fast<WL,IWL>):用 C++double實現(精度 53 位),仿真速度更快,適合對精度要求不極致的場景。
- 運行時配置類型(Run-Time Configurable)
sc_fix/sc_ufix:運行時指定位寬和模式(如sc_fix(5,3, SC_RND, SC_SAT)),對象創建後配置不可修改,靈活性高於編譯時類型,但速度稍慢。
- 核心配置參數
- 溢出模式:
SC_SAT(飽和)、SC_WRAP(環繞)、SC_SAT_SYM(對稱飽和)等,控制數值超出範圍時的處理方式。 - 量化模式:
SC_RND(四捨五入)、SC_TRN(截斷)、SC_RND_ZERO(向零舍入)等,控制小數部分截斷 / 舍入規則。
四、字符串與字面量(Literal & String)
SystemC 提供統一的字符串表示格式,支持不同進制(二進制、八進制、十六進制)和符號類型,方便硬件信號的初始化與調試。
- 字面量格式
- 前綴標識:
0b(二進制,如0b1011)、0o(八進制,如0o15)、0x(十六進制,如0x0d)、0d(十進制,默認)。 - 符號與格式:
us(無符號,如0bus1101)、sm(符號幅度,如0bsm01101),支持負數的 2 補碼或符號幅度表示。
- 字符串轉換與 IO
to_string(sc_numrep rep, bool wprefix):將 SystemC 數據類型轉換為字符串,rep指定格式(如SC_BIN、SC_HEX),wprefix控制是否顯示前綴(如0b)。- 流操作:支持
cout/cin直接輸入輸出(如cout << sc_int_var),兼容 C++ 標準流。
五、操作特性與兼容性
- 跨類型操作
- 可與原生 C++ 類型(
int、double、bool)混合賦值和運算,SystemC 自動處理類型轉換(如sc_int<8> a = 10; int b = a;)。 - 注意:混合不同 SystemC 類型運算時(如
sc_int<8>與sc_bigint<16>),需顯式轉換避免精度丟失。
- 與端口 / 信號的關聯
- 端口(
sc_in<T>、sc_out<T>)和信號(sc_signal<T>)的模板參數需指定 SystemC 專用數據類型,如sc_in<sc_uint<4>>(4 位無符號輸入端口)、sc_signal<sc_lv<8>>(8 位 4 值信號),實現模塊間的類型安全通信(🔶1-9、🔶1-1445、摘要 3)。
- 性能建議
- 優先使用原生 C++ 類型(
int、double)提升仿真速度;需硬件位寬 / 多值邏輯時,再選擇 SystemC 專用類型。 - 整數類型:
sc_int<W>快於sc_bigint<W>;定點數類型:fast版本快於普通版本。
六、C++的原生數據類型
七、更高層次抽象與STL(Standard Template Library)
STL 是這些庫中最受歡迎的,並且所有現代 C++ 編譯器都自帶它。STL 包含許多有用的數據類型和結構,包括一種被稱為 string 的改進字符數組,以及諸如 vector<T>、map<T,T>、set<T>、list<T> 和 deque<T> 之類的通用容器。這些容器可以通過 STL 算法進行操作,例如 for_each()、count()、min_element()、max_element()、search()、transform()、reverse() 和 sort()。這些只是可用算法中的一小部分。
八、數據類型的選擇
一個常見的問題是:“此設計應使用哪些數據類型?”最佳答案是:“根據當前的建模需求,選擇儘可能接近原生C++的數據類型。”選擇原生數據類型總能帶來最快的仿真速度。表3.7展示了相關性能情況。
除非你需要比原生C++數據類型更詳細的信息,否則不要使用sc_int<W>或sc_bigint<W>。為了獲得更高的性能,對於64位或更少位數的數據,優先使用sc_int<W>而非sc_bigint<W>。一般來説,SystemC數據類型比原生C++數據類型慢,而更復雜的SystemC類型比更簡單、更小的類型慢。RTL綜合工具通常要求所有數據都為SystemC數據類型。一些行為綜合工具允許使用原生C++數據類型。SystemC數據類型可用於指導行為綜合工具。