Để mô hình hóa gần hơn với phần cứng. SystemC cung cấp hai loại vector logic: sc_bv<W> (bit vector) và sc_lv<W> (logic vector), và một loại logic đơn bit là sc_logic.

image_3_3_0

ref: https://www.chipverify.com/images/verilog/values.png (opens new window)

Các loại vector logic của SystemC được thiết kế để mô hình hóa gần với RTL (hạn chế: không thực hiện các phép toán số học). Chúng thực hiện đầy đủ các phép gán và phép toán logic, với một số hạn chế.

Ví dụ, một sc_lv<W> với các giá trị bit high-z hoặc không xác định (x) không thể gán cho một sc_bv<W> mà không mất một số thông tin.

# 1. sc_bv<W> Kiểu dữ liệu vector bit của SystemC

image_3_3_1

Cách khai báo: sc_bv<BITWIDTH> NAME;

sc_bv<W>, có các khả năng tương tự như sc_lv<W> nhưng giá trị bit bị giới hạn ở logic 0 hoặc logic 1. sc_bv<W> là một lớp mẫu mà W xác định độ rộng bit.

Các phép toán vector bit của SystemC bao gồm tất cả các toán tử bitwise-and, bitwise-or và bitwise-xor thông thường (&, |, ^). Ngoài việc chọn bit và phạm vi bit (với [] và range()), sc_bv<W> còn hỗ trợ API cho các phép toán and_reduce(), or_reduce(), nand_reduce(), nor_reduce(), xor_reduce() và xnor_reduce().

  • ví dụ:

       sc_bv\<7\> mask = "0100111"; // khai báo 7 bit sc_bv
       sc_bv\<8\> value ="11101111";  khai báo 8 bit sc_bv
       sc_bv\<7\> active = value & mask; // 0100111
       sc_bv\<1\> data_all = active.and_reduce(); // SC_LOGIC_0
        /// value :" "111[01]111"    
       value.range(4,3) = "01";// 00001
        /// value : "111[0]1111"  
       value[4] = active[0];
    

# 2. sc_logic và sc_lv<W>

image_3_3_2

Thú vị hơn các kiểu dữ liệu Boolean (0,1) là các kiểu dữ liệu bốn giá trị (0,1,x,z) được sử dụng để biểu diễn các điều kiện không xác định và trở kháng cao (tri-state) (rõ hơn bạn tham khảo verilog nhé). SystemC sử dụng sc_logic và sc_lv<W> để biểu diễn các kiểu dữ liệu này. Trạng thái logic của các kiểu dữ liệu này được biểu diễn như sau:

• 0 - SC_LOGIC_0, Log_0, or ‘0’

• 1 - SC_LOGIC_1, Log_1, or ‘1’

• z - SC_LOGIC_Z, Log_Z, ‘Z’ or ‘z’

• x - SC_LOGIC_X, Log_X, ‘X’ or ‘x’

Do chi phí xử lý (vì các kiểu dữ liệu này có thể xem như là 1 class trong C++), các kiểu dữ liệu này chậm hơn đáng kể so với bool và sc_bv.

Kiểu dữ liệu sc_logic là phiên bản đơn bit của lớp mẫu sc_lv<W> mà tham số mẫu duy nhất là độ rộng bit (W).

cách khai báo:

sc_logic NAME;

sc_lv<BITWIDTH> NAME;

Tương tự như sc_bv<W>.Các phép toán trong vector logic của SystemC bao gồm tất cả các toán tử bitwise-and, bitwise-or và bitwise-xor thông thường (&, |, ^). Ngoài việc chọn bit và phạm vi bit ([] và range()), sc_lv<W> còn hỗ trợ các phép toán and_reduce(), or_reduce(), nand_reduce(), nor_reduce(), xor_reduce() và xnor_reduce().

Ref: https://eda-playground.readthedocs.io/en/latest/_static/systemc-2.3.1/sysc/a00026.html#ad63355747d6f0cddcc9a3770b554bbd6 (opens new window)

# SystemC Home