[1] SystemC Literal and String
SystemC cung cấp các cơ chế cho việc biểu diễn dữ liệu dạng chuỗi (literal data) và xử lý chuỗi, dựa trên các biểu diễn của C++.
[1.1] SystemC String Literals Representations
Các chuỗi ký tự của SystemC được sử dụng để gán giá trị cho bất kỳ kiểu dữ liệu SystemC nào.
Một chuỗi ký tự SystemC bao gồm tiền tố (prefix), một giá trị (magnitude) và một ký tự dấu tùy chọn (“+” hoặc “-“)
Quy tắc về dấu:
- Ký tự dấu tùy chọn có thể đứng trước tiền tố đối với các dạng số thập phân và dấu-và-giá-trị.
- Tuy nhiên, nó không được phép sử dụng với các kiểu không dấu, nhị phân, bát phân và thập lục phân.
- Các giá trị âm cho dạng nhị phân, bát phân và thập lục phân có thể được biểu diễn bằng dạng bù hai (two’s complement representation).
Các tiền tố được hỗ trợ:
sc_numrep | Prefix | Meaning | sc_int<5> = 13 sc_int<5> = -13 |
---|---|---|---|
SC_DEC | 0d | Decimal | 0d13 -0d13 |
SC_BIN | 0b | Binary | 0b01101 0b10011 |
SC_BIN_US | 0bus | Binary unsigned | 0bus1101 |
SC_BIN_SM | 0bsm | Binary signed | 0bsm01101 -0bsm01101 |
SC_OCT | 0o | Octal | 0o15 0o63 |
SC_OCT_US | 0ous | Octal unsigned | 0ous15 |
SC_OCT_SM | 0osm | Octal signed | 0osm15 -0osm15 |
SC_HEX | 0x | Hex | 0x0d 0xf3 |
SC_HEX_US | 0xus | Hex unsigned | 0xusd |
SC_HEX_SM | 0xsm | Hex signed | 0xsm0d -0xsm0d |
SC_CSD | 0csd | Canonical | 0csd10-01 0csd-010- |
string to_string(sc_numrep rep, bool wprefix);
Phương thức to_string():
- Cho phép chuyển đổi các thể hiện của kiểu dữ liệu SystemC thành một chuỗi C++ tiêu chuẩn.
- Định dạng của chuỗi kết quả được chỉ định bằng cách sử dụng liệt kê
sc_numrep
. - Phương thức này có hai đối số:
sc_numrep rep
(biểu diễn số) và mộtbool wprefix
(để thêm tiền tố biểu diễn vào chuỗi)
[1.2] String Input and Output
SystemC hỗ trợ input stream bằng toán tử >> và output stream bằng toán tử <<.
Input stream sử dụng các tiền tố theo nghĩa đen được hiển thị trong cột thứ hai của Table 3.1 để xác định định dạng dữ liệu được đọc từ luồng đầu vào.
Output stream có thể sử dụng các bộ xử lý luồng đầu ra C++ là dec, oct và hex để định dạng hiển thị của các kiểu dữ liệu SystemC. Có thể đạt được khả năng hiển thị bổ sung bằng cách sử dụng các phương thức to_string của kiểu dữ liệu này
//-------------------------------------------------
// sc_lv<8> 8-bit logic vectors
//-------------------------------------------------
sc_lv<8> LV1;
LV1 = 15;
cout << " LV1= " << LV1;
sc_lv<8> LV2("0101xzxz"); // literal string init
cout << " LV2= " << LV2;
cout << endl;
//-------------------------------------------------
// sc_int<5> 5-bit signed integer
//-------------------------------------------------
sc_int<5> Int1; // 5-bit signed integer
Int1 = "-0d13"; // assign -13
cout << " Int1=" << Int1;
cout << " SC_BIN=" << Int1.to_string(SC_BIN);
cout << " SC_BIN_SM=" << Int1.to_string(SC_BIN_SM);
cout << " " << endl;
cout << " SC_HEX=" << Int1.to_string(SC_HEX);
cout << endl;
//-------------------------------------------------
// sc_fixed<5,3> fixed 3-bit int & 2 bit fraction
//-------------------------------------------------
sc_fixed<5,3> fix1; // fixed point
fix1 = -3.3;
cout << " fix1=" <<fix1;
cout << " SC_BIN=" << fix1.to_string(SC_BIN);
cout << " SC_HEX=" << fix1.to_string(SC_HEX);
cout << endl;
Output
LV1=00001111 LV2=0101XZXZ
Int1=-13 SC_BIN=0b10011 SC_BIN_SM=-0bsm01101
SC_HEX=0xf3
fix1=-3.5 SC_BIN=0b100.10 SC_HEX=0xc.8
[2] Operators for SystemC Data Types
Các kiểu dữ liệu SystemC hỗ trợ tất cả các thao tác phổ biến với việc toán tử.
Comparison | == != > >= < <= |
Arithmetic | ++ — * / % + – << >> |
Bitwise | ~ & | ^ |
Assignment | = &= |= ^= *= /= %= += -= <<= >>= |
Ngoài ra, SystemC cung cấp các phương pháp đặc biệt để truy cập bit, phạm vi bit.
Bit Selection | bit(idx), [idx] |
Range Selection | range(high,low), (high,low) |
Conversion (to C++ types) | to_double(),to_int(), to_int64(),to_long(),to_uint(),to_uint64(), to_ulong(),to_string(type) |
Testing | is_zero(), is_neg(), length() |
Bit Reduction | and_reduce(),nand_reduce(), or_reduce(),nor_reduce(), xor_reduce(), xnor_reduce() |
//-------------------------------------------------
// bit-select and part-select examples
//-------------------------------------------------
sc_uint<8> I1 = "0x35"; // 8-bit signed integer
sc_uint<5> I2 = "0b01010"; // 5-bit signed integer
sc_uint<4> I3 = 0; // 5-bit signed integer
sc_uint<16> I4 = 0; // 16-bit signed
integer
I3 = I2.range(3,0); // I3= 0b1010
I3[2] = true; // I3= 0b1110
I3[0] = true; // I3= 0b1111
I4 = (I3,I1.range(7,4),I2(3,0),I1(3,0));
// I4 = 0x0f3a5 HEX format
// I4 = 0b01111001110100101 BIN format
Lưu ý quan trọng về việc trộn các kiểu dữ liệu khác nhau trong phép toán số học: Đây là một khía cạnh thường bị bỏ qua nhưng rất quan trọng. Khi thực hiện phép toán với các kiểu dữ liệu SystemC (và cả C++), việc trộn các kiểu dữ liệu tương tự có độ dài khác nhau là chấp nhận được (ví dụ: sc_int<3> và sc_int<5>). Tuy nhiên, việc trộn các kiểu dữ liệu khác loại (ví dụ: sc_int và sc_bigint) có thể nguy hiểm.
Cụ thể, việc gán kết quả của một phép toán bao gồm hai biến sc_int cho một sc_bigint sẽ không tự động “nâng cấp” các toán hạng lên sc_bigint cho các phép tính trung gian.
Để đảm bảo phép toán được thực hiện chính xác với kiểu dữ liệu lớn hơn, cần phải chuyển đổi rõ ràng (explicit conversion) ít nhất một trong các toán hạng sang kiểu dữ liệu mong muốn
sc_int<3> d(3);
sc_int<5> e(15);
sc_int<5> f(14);
sc_int<7> sum = d + e + f;// Works
sc_int<64> g("0x7000000000000000");
sc_int<64> h("0x7000000000000000");
sc_int<64> i("0x7000000000000000");
sc_bigint<70> bigsum = g + h + i; // Doesn’t work
bigsum = sc_bigint<70>(g) + h + i;// Works
[3] Choosing the Right Data Type
Một câu hỏi thường gặp là: “Nên sử dụng kiểu dữ liệu nào cho thiết kế này?”. Câu trả lời tốt nhất là: “Chọn kiểu dữ liệu gần nhất có thể với C++ gốc cho nhu cầu mô hình hóa hiện tại”. Việc chọn kiểu dữ liệu gốc luôn mang lại tốc độ mô phỏng nhanh nhất.
Speed | Data type |
Fastest | Native C/C++ Data Types (e.g., int, double and bool) sc_int<W>, sc_uint<W> sc_bv<W> sc_logic, sc_lv<W> sc_bigint<W>, sc_biguint<W> sc_fixed_fast<WL,IL,…>, sc_fix_fast, sc_ufixed_fast<WL,IL,…>, sc_ufix_fast |
Slowest | sc_fixed<WL,IL,…>, sc_fix, sc_ufixed<WL,IL,…>, sc_ufix |