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.
[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.
1 2 3 4 |
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ố.Bộ dữ liệu mô hình một có độ rộng bit lên tới 64-bits; một tập hợp dữ liệu mô hình khác có độ rộng bit lớn hơn 64-bits.
[2.1] sc_int and sc_uint
1 2 |
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
1 2 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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’.
Because of the overhead, these data types are considerably slower than their sc_bit and sc_bv counterparts. For best performance, always use built-in types such as bool. Do chi phí hoạt động, 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 (điểm cố định) sau: sc_fixed, sc_ufixed, sc_fix, sc_ufix và các biến thể _fast của chúng.
Các kiểu dữ liệu tích hợp không đáp ứng tất cả các kiểu thiết kế. Đặc biệt, các ứng dụng DSP thường cần biểu diễn các số có thành phần phân số. SystemC cung cấp tám loại dữ liệu biểu diễn số fixed-point (điểm cố định). Trong khi các kiểu dữ liệu gốc float và double đáp ứng các biểu diễn cấp cao, thì phần cứng có thể thực hiện được lại có các yêu cầu về tốc độ và diện tích. Ngoài ra, bộ xử lý DSP dựa trên số nguyên không hỗ trợ dấu chấm động. Số fixed-point cung cấp một giải pháp hiệu quả trong cả phần cứng và phần mềm.