Các kiểu dữ liệu SystemC hỗ trợ tất cả các phép toán thông thường với việc nạp chồng toán tử như minh họa trong Bảng 3.5.

Ngoài ra, SystemC cung cấp các phương thức đặc biệt để xử lý các toán tử bit, phạm vi bit và phép nối. Việc chọn bit và phần cũng như hỗ trợ phép nối giống với các ngôn ngữ mô tả phần cứng. Sự hỗ trợ này cho phép mô phỏng đơn giản các trường trong các ngôn ngữ mô tả phần cứng.

# Bảng 3.5 Toán tử

Toán tử Phép toán
So sánh == != < <= > >=
Gán = += -= *= /= %= &= ^= |= <<= >>=
Số học + - * / % << >> & ^ | ~ !

# Bảng 3.6 Các phương thức đặc biệt

Phương thức Chức năng
Chọn phạm vi (C++) range(high, low), (high, low)
Chuyển đổi chuỗi to_string(radix=10), to_string(16), to_ulong(), to_long(), to_int64(), to_uint64(), to_int(), to_uint()
Kiểm tra length(), is_0(), is_negative(), is_even(), is_odd()
Giảm bit and_reduce(), nand_reduce(), or_reduce(), nor_reduce(), xor_reduce(), xnor_reduce()

Dữ liệu được đóng gói hoặc nối các bit hoặc trường bit để tạo ra các đối tượng dữ liệu được đóng gói. Một vài ví dụ được thể hiện trong Hình 3.15.

// Lựa chọn bit và phần, nối
sc_int data; // 16 bit số nguyên có dấu
sc_int low_byte = data(7, 0); // 8 bit thấp
sc_int high_byte = data(15, 8); // 8 bit cao
sc_uint addr = 12; // 16 bit số nguyên không dấu
sc_uint nibble = addr(15, 12); // 4 bit cao
sc_uint bit = addr(0); // Bit thấp
sc_uint long_addr = {0, addr}; // Nối
sc_lv bus = "10101010"; // Định dạng nhị phân
sc_lv hex_bus = "0xA"; // Định dạng thập lục phân

Hình 3.15 Lựa chọn bit, phần và nối

Một khía cạnh thường bị bỏ qua của các kiểu dữ liệu này (và các kiểu dữ liệu C++) là việc trộn lẫn các kiểu dữ liệu trong các phép toán số học. Việc trộn lẫn các kiểu dữ liệu tương tự của các độ dài bit khác nhau trong các phép toán số học là ổn. Ví dụ, việc gán kết quả của một phép toán liên quan đến hai biến sc_int<n> cho một biến sc_bigint<m> không tự động mở rộng toán hạng trong sc_int<n> cho các phép tính trung gian. Để đạt được điều đó, cần phải có ít nhất một trong các toán hạng là một sc_bigint. Dưới đây là một ví dụ về phép cộng:

sc_int a;
sc_int b;
sc_bigint w = a + b; // Không hoạt động
sc_bigint x = sc_bigint(a) + b; // Hoạt động
sc_bigint y = a + sc_bigint(b); // Hoạt động
sc_bigint z = sc_bigint(a) + sc_bigint(b); // Hoạt động
sc_bigint h = a + (sc_bigint)b; // Hoạt động


ví dụ:

#include <vector>
int main(int argc, char* argv[]) {
  std::vector<int> memory(1024);
  memory[0] = 1; // Khởi tạo giá trị ban đầu
  memory[1] = 2;
  memory.resize(2048); // Tăng kích thước bộ nhớ
  return 0;
}

## [SystemC Home](/danh-muc/systemc.md)