SystemC 專用數據類型是為適配硬件建模需求設計的,支持多值邏輯、靈活位寬控制、定點運算等硬件特有特性,主要集中在書中第三章 “Data Types” ,同時與端口、信號等組件的類型聲明緊密關聯,以下按類型分類梳理核心內容:

一、邏輯向量類型(Logic Vector Types)

此類類型用於建模硬件中的位信號,分為2 值邏輯(僅 0、1)和4 值邏輯(0、1、X - 未知、Z - 高阻),支持位級操作(選擇、範圍截取、縮減運算)。

  1. 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 位結果)。
  • 適用場景:無需多值邏輯的純數字信號建模,如控制總線、地址線。
  1. sc_lv<W>(Logic Vector)(相比sc_bv運行開銷大,滿得多)
  • 4 值邏輯向量,位寬由W指定,支持 0、1、X(未知)、Z(高阻),兼容硬件中的不確定狀態和三態總線。
  • 操作與sc_bv<W>一致,但需注意多值邏輯的運算規則(如 X 與任何值運算仍為 X)。
  • 適用場景:需要表示未知或高阻狀態的信號,如總線競爭、未初始化信號。
  1. 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++ 整數位寬依賴平台的缺陷。

  1. sc_int<W> / sc_uint<W>(Limited-Precision Integers)
  • 有符號(sc_int<W>)/ 無符號(sc_uint<W>)整數,位寬W範圍為 1~64 位,內部映射到處理器原生指令,仿真速度快
  • 核心特性:支持加減乘除、移位、位與 / 或 / 異或等算術和位操作,可與原生 C++ 整數(如int)混合賦值(自動類型轉換)。
  • 適用場景:64 位以內的硬件整數建模,如計數器、寄存器。
  1. 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宏啓用。

  1. 編譯時配置類型(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 位),仿真速度更快,適合對精度要求不極致的場景。
  1. 運行時配置類型(Run-Time Configurable)
  • sc_fix / sc_ufix:運行時指定位寬和模式(如sc_fix(5,3, SC_RND, SC_SAT)),對象創建後配置不可修改,靈活性高於編譯時類型,但速度稍慢。
  1. 核心配置參數
  • 溢出模式:SC_SAT(飽和)、SC_WRAP(環繞)、SC_SAT_SYM(對稱飽和)等,控制數值超出範圍時的處理方式。
  • 量化模式:SC_RND(四捨五入)、SC_TRN(截斷)、SC_RND_ZERO(向零舍入)等,控制小數部分截斷 / 舍入規則。

四、字符串與字面量(Literal & String)

SystemC 提供統一的字符串表示格式,支持不同進制(二進制、八進制、十六進制)和符號類型,方便硬件信號的初始化與調試

  1. 字面量格式
  • 前綴標識:0b(二進制,如0b1011)、0o(八進制,如0o15)、0x(十六進制,如0x0d)、0d(十進制,默認)。
  • 符號與格式:us(無符號,如0bus1101)、sm(符號幅度,如0bsm01101),支持負數的 2 補碼或符號幅度表示。
  1. 字符串轉換與 IO
  • to_string(sc_numrep rep, bool wprefix):將 SystemC 數據類型轉換為字符串,rep指定格式(如SC_BINSC_HEX),wprefix控制是否顯示前綴(如0b)。
  • 流操作:支持cout/cin直接輸入輸出(如cout << sc_int_var),兼容 C++ 標準流。

五、操作特性與兼容性

  1. 跨類型操作
  • 可與原生 C++ 類型(intdoublebool)混合賦值和運算,SystemC 自動處理類型轉換(如sc_int<8> a = 10; int b = a;)。
  • 注意:混合不同 SystemC 類型運算時(如sc_int<8>sc_bigint<16>),需顯式轉換避免精度丟失。
  1. 與端口 / 信號的關聯
  • 端口(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)。
  1. 性能建議
  • 優先使用原生 C++ 類型(intdouble提升仿真速度;需硬件位寬 / 多值邏輯時,再選擇 SystemC 專用類型。
  • 整數類型:sc_int<W>快於sc_bigint<W>;定點數類型:fast版本快於普通版本。

六、C++的原生數據類型

     

C 數據類型總結_weixin_建模

七、更高層次抽象與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數據類型可用於指導行為綜合工具。

C 數據類型總結_weixin_建模_02