Home / SystemC / [ SC Tutorial ] 3. SystemC Data types (part 2): Strings & Operators

[ SC Tutorial ] 3. SystemC Data types (part 2): Strings & Operators

[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_numrepPrefixMeaningsc_int<5> = 13
sc_int<5> = -13
SC_DEC0dDecimal0d13
-0d13
SC_BIN0bBinary0b01101
0b10011
SC_BIN_US0busBinary unsigned0bus1101
SC_BIN_SM0bsmBinary signed0bsm01101
-0bsm01101
SC_OCT0oOctal0o15
0o63
SC_OCT_US0ousOctal unsigned0ous15
SC_OCT_SM0osmOctal signed0osm15
-0osm15
SC_HEX0xHex0x0d
0xf3
SC_HEX_US0xusHex unsigned0xusd
SC_HEX_SM0xsmHex signed0xsm0d
-0xsm0d
SC_CSD0csdCanonical0csd10-01
0csd-010-
Table 3.1 Unified string representation for SystemC
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ột bool 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= &= |= ^= *= /= %= += -= <<= >>=
Table 3.2 Operators

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 Selectionbit(idx), [idx]
Range Selectionrange(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)
Testingis_zero(), is_neg(), length()
Bit Reductionand_reduce(),nand_reduce(), or_reduce(),nor_reduce(), xor_reduce(), xnor_reduce()
Table 3.3 Special methods
//-------------------------------------------------
// 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.

SpeedData type
FastestNative 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
Slowestsc_fixed<WL,IL,…>, sc_fix,
sc_ufixed<WL,IL,…>, sc_ufix
Table 3.3 Data type performance

__FreeSourceC.com__

About admin

Check Also

[ SC Tutorial ] 6. Module : The Basic Unit of Execution

1.Simulation process Simulation process là đơn vị thực thi cơ bản trong SystemC. Chúng có …

Leave a Reply

Your email address will not be published. Required fields are marked *