SystemC có một số kiểu dữ liệu được xác định trước để hỗ trợ các thiết kế phần cứng mở rộng từ các kiểu dữ liệu C++ gốc đến các biểu diễn số thực (fixed-point). Việc chọn loại dữ liệu tùy thuộc vào phạm vi giá trị được biểu diễn, độ chính xác được yêu cầu và các thao tác được yêu cầu. Việc lựa chọn kiểu dữ liệu cũng ảnh hưởng đến tốc độ mô phỏng, khả năng tổng hợp và kết quả tổng hợp. Các kiểu dữ liệu được sử dụng khác nhau tùy thuộc vào mức độ trừu tượng được thể hiện trong mô hình của bạn. Việc sử dụng các kiểu dữ liệu C++ gốc có thể tối đa hóa hiệu suất mô phỏng, nhưng sẽ làm giảm độ trung thực của phần cứng và khả năng tổng hợp.
[1] Native Data Types
SystemC là một thư viện lớp C++, do đó, SystemC hỗ trợ tất cả các kiểu dữ liệu gốc của C++: bool, char, short, int, unsigned char, unsigned short int, unsigned int, long int, unsigned long int, double, float, …
Các kiểu dữ liệu gốc của C++ là hiệu quả nhất về mặt sử dụng bộ nhớ và tốc độ thực thi của trình mô phỏng vì chúng có thể được ánh xạ trực tiếp vào các lệnh của bộ xử lý.
sc_in<unsigned long long> clock;
sc_out<unsigned char> error;
sc_signal<bool> rst_sig;
...
[2] Arithmetic Data Types
SystemC cung cấp hai bộ kiểu dữ liệu số. Hai kiểu dữ liệu này là kiểu số nguyên có độ chính xác giới hạn, có độ dài tối đa 64-bits , và kiểu số nguyên có độ chính xác hữu hạn, có thể dài hơn nhiều.
[2.1] sc_int and sc_uint
sc_int<W> m_int;
sc_uint<W> m_uint;
Các kiểu dữ liệu số sc_int và sc_uint (không dấu) tích hợp sẵn cung cấp một cách hiệu quả để lập mô hình dữ liệu với độ rộng cụ thể từ 1 đến 64-bits.
Bất kỳ loại dữ liệu nào không có nguồn gốc từ ngôn ngữ C++ sẽ mô phỏng chậm hơn các loại gốc (Built-in types). Do đó, các kiểu dữ liệu C++ dựng sẵn (ví dụ: int, unsigned int, …) nhanh hơn sc_int và sc_uint.
NOTE: Không sử dụng sc_int trừ khi hoặc cho đến khi cần thiết. Một điều kiện cần thiết để sử dụng sc_int là khi sử dụng các công cụ tổng hợp yêu cầu đại diện phần cứng.
[2.2] sc_bigint and sc_biguint
sc_bigint<W> m_bigint;
sc_biguint<W> m_biguint;
Một số phần cứng có thể lớn hơn số lượng được hỗ trợ bởi các kiểu dữ liệu C++ gốc. SystemC cung cấp sc_bigint và sc_biguint cho mục đích này
NOTE : Không sử dụng sc_bigint cho 64-bits trở xuống. Làm như vậy sẽ khiến hiệu suất bị ảnh hưởng so với việc sử dụng sc_int
[3] Boolean Data Types
[3.1] sc_bit and sc_bv
Đối với các số 1 và 0, SystemC cung cấp sc_bit và đối với các bit-vector dài, SystemC cung cấp các kiểu dữ liệu sc_bv<> (vector bit). Các loại này không hỗ trợ dữ liệu số học như các loại sc_int và các loại dữ liệu này không thực thi nhanh như các loại bool và std::bitset
sc_bit m_bit_1(SC_LOGIC_0); // m_val = false;
sc_bit m_bit_2; // m_val = false;
m_bit_2 = 1; // m_val = true;
sc_bit m_bit_3(sc_dt::Log_1);// m_val = true;
sc_bv<5> m_bit_vecto = "0111001"; //m_len = 5 (bits), m_data = 0x19
sc_bv<4> m_mask = "1100"; //m_len = 4 (bits), m_data = 0xC
sc_bv<6> m_or = m_bit_vecto | m_mask;//m_len = 6 (bits), m_data = 0x1D
sc_bv<6> m_and_reduce = m_bit_vecto.and_reduce(); //m_len = 6 (bits), m_data = 0x0
sc_bv<6> m_nand_reduce = m_bit_vecto.nand_reduce(); //m_len = 6 (bits), m_data = 0x1
sc_bv<6> m_or_reduce = m_bit_vecto.or_reduce(); //m_len = 6 (bits), m_data = 0x1
sc_bv<6> m_nor_reduce = m_bit_vecto.nor_reduce(); //m_len = 6 (bits), m_data = 0x0
sc_bv<6> m_xnor_reduce = m_bit_vecto.xnor_reduce(); //m_len = 6 (bits), m_data = 0x0
m_bit_vecto.range(3, 2) = "00"; //m_bit_vecto changed : m_len = 5 (bits), m_data = 0x11
m_bit_vecto[1] = "1"; //m_bit_vecto changed : m_len = 5 (bits), m_data = 0x13
[3.2] sc_logic and sc_lv
SystemC thể hiện các mức logic với các kiểu dữ liệu sc_logic và sc_lv<> (logic vector). Các loại này được thể hiện bằng SC_LOGIC_1, SC_LOGIC_0, SC_LOGIC_X và SC_LOGIC_Z. Để ít gõ hơn, nếu sử dụng namespace sc_dt, thì hãy gõ Log_1, Log_0, Log_X và Log_Z hoặc thậm chí gõ ‘1’, ‘0’, ‘X’ và ‘Z’.
sc_logic m_logic_1;
sc_lv<5> m_lv_1 = "01xz1";
Các loại dữ liệu này chậm hơn đáng kể so với sc_bit và sc_bv. Để có hiệu suất tốt nhất, hãy luôn sử dụng các loại tích hợp sẵn như bool (Built-in types).
[4] Fixed-point Data Types
SystemC cung cấp các kiểu dữ liệu số thực để đáp ứng nhu cầu mô hình hóa các ứng dụng xử lý tín hiệu số (DSP) mà không yêu cầu phần cứng dấu phẩy động.
Các kiểu kết thúc bằng _fast (ví dụ: sc_fixed_fast, sc_ufixed_fast) nhanh hơn các kiểu khác vì độ chính xác bên trong của chúng bị giới hạn ở 53 bit và được triển khai bằng C++ double.
- Tiền tố sc_ufix biểu thị kiểu không dấu.
- Hậu tố ed (ví dụ: sc_fixed) chỉ ra kiểu dữ liệu được khuôn mẫu (templated) và phải có các tham số tĩnh được định nghĩa bằng các hằng số thời gian biên dịch.
- sc_fix, sc_ufix, sc_fix_fast, và sc_ufix_fast là các kiểu cấu hình tại thời điểm chạy
Tham số:
sc_fixed<WL,IWL[,QUANT[,OVFLW[,NBITS]> NAME;
sc_ufixed<WL,IWL[,QUANT[,OVFLW[,NBITS]> NAME;
sc_fixed_fast<WL,IWL[,QUANT[,OVFLW[,NBITS]> NAME;
sc_ufixed_fast<WL,IWL[,QUANT[,OVFLW[,NBITS]> NAME;
sc_fix NAME(WL,IWL[,QUANT[,OVFLW[,NBITS]);
sc_ufix NAME(WL,IWL[,QUANT[,OVFLW[,NBITS]);
sc_fix_fast NAME(WL,IWL[,QUANT[,OVFLW[,NBITS]);
sc_ufix_fast NAME(WL,IWL[,QUANT[,OVFLW[,NBITS]);
- Word Length (WL) và Integer Word Length (IWL) là các tham số bắt buộc và không có giá trị mặc định.
- Chế độ tràn (Overflow mode – OVFLW) và chế độ lượng tử hóa (quantization mode – QUANT), và số bit bão hòa (NBITS) có giá trị mặc định. Các chế độ tràn bao gồm SC_SAT, SC_SAT_ZERO, SC_SAT_SYM, SC_WRAP, SC_WRAP_SYM. Các chế độ lượng tử hóa bao gồm SC_RND, SC_RND_ZERO, SC_RND_MIN_INF, SC_RND_INF, SC_RND_CONV, SC_TRN, SC_TRN_ZERO.
Cách sử dụng:
// to enable fixed-point data types
#define SC_INCLUDE_FX
#include <systemc>
// fixed-point data types are now enabled
sc_fixed<5,3> m_compass // 5-bit fixed-point word
- Để sử dụng kiểu dữ liệu dấu phẩy động, bạn phải định nghĩa #define SC_INCLUDE_FX trước khi bao gồm tệp tiêu đề SystemC.
- Đối với các mảng kiểu _fix, cần sử dụng kiểu sc_fxtype_context để thiết lập các giá trị mặc định vì cú pháp C++ không cho phép đối số cho hàm tạo trong trường hợp này.
Hiệu suất:
- Các kiểu dữ liệu dấu phẩy động chậm hơn đáng kể so với các kiểu dữ liệu C++ float hoặc double.
- Nên sử dụng các kiểu dữ liệu dấu phẩy động C++ gốc (native) cho các mô hình DSP ban đầu để đạt tốc độ mô phỏng cao hơn.