Thứ Bảy, 20 tháng 4, 2019

[SystemC][High Level Design]Bài 4 - Mô tả model code cho TOP-module bằng SystemC

Bài viết này hướng dẫn cách mô hình hóa TOP module của model code. TOP module là thành phần gọi các sub-module để tạo ra các instance. Trước khi đọc bài viết này, các bạn nên đọc các bài viết trước đó để hiểu một số thuật ngữ.
(bài 1  bài 2 bài 3)

1) Phương pháp viết model code cho TOP module
Việc mô tả TOP module gồm các thành phần cơ bản sau:
  • Gọi tất cả các file header của các sub-module
  • Khai báo TOP module
  • Khai báo port
  • Khai báo tín hiệu kết nối giữa các instance
  • Khai báo các instance
  • Constructor
    • Liệt kê tất cả các instance
    • Kết nối các instance
Cú pháp khai báo TOP module – cách 1
//Include header file of sub-modules
SC_MODULE (top_module_name) {
  //Port_declaration
  //Signal_declaration
  //Instance_eclaration
  SC_CTOR (top_module_name) : instance_list {
   //Instance_connection
  }
};
Trong đó: 
  • Instance_declaration được khai báo theo cú pháp sau:
module_name instance_name;

  • Instance_list được khai báo như sau:
instance_name_0(“id_string_0”),

instance_name_1(“id_string_1”), …
với id_string là một chuỗi ký tự định danh bất kỳ không chứa khoảng trắng.
  • Instance_connection được khai báo như sau:
instance_name.port_name(signal_name);

với port_name là tên port của module và signal_name là tên tín hiệu nối đến port đó. signal_name có thể trùng hoặc khác port_name.

Cú pháp khai báo TOP module – cách 2
//Include header file of sub-modulesSC_MODULE (top_module_name) {  //Port_declaration  //Signal_declaration  //Poiter_creation
  SC_CTOR (top_module_name) {    //Instance_creation
    //Instance_connection
  }
};
Trong đó:
  • Pointer_creation được khai báo như sau: 
module_name *instance_name; 
  • Instance_creation được khai báo như sau: 
instance_name = new module_name(“id_string”); 
  • Instance_connection là kết nối của các instance được khai báo như sau: 
instance_name->port_name(signal_name);

Để tương thích với phần mềm Vivado của Xilinx sử dụng trong tài liệu này, chúng ta phải sử dụng cách 1 cho khai báo TOP module.
2) File TOP module
Model code của file TOP module scpu_top

#include "scpu_fetch.h"
#include "scpu_decoder.h"
#include "scpu_execute.h"
//--------------------------------------
//Project: Simple CPU
//Module:  TOP module
//Function:Connect all sub-modules (FETCH, DECODER, EXECUTE)
//Authod:  Nguyen Hung Quan
//Page:    VLSI Technology
//--------------------------------------

SC_MODULE (scpu_top) {
sc_in<bool> clk;
sc_in<bool> rst_n;
//
//Internal connection
//
sc_signal<bool> dc_load_pc;
sc_signal<bool> dc_imm;
sc_signal<sc_uint<2> > dc_addr_sel;
sc_signal<sc_uint<8> > dc_rs;
sc_signal<sc_uint<8> > dc_rd;
sc_signal<bool> dc_mem_wr;
sc_signal<bool> dc_load_dr;
sc_signal<bool> dc_load_ir;
//
sc_signal<sc_uint<8> > fetch_ir;
sc_signal<sc_uint<8> > fetch_dr;
sc_signal<sc_uint<8> > fetch_mem_dout;
sc_signal<sc_uint<8> > ex_dout;
//
sc_signal<sc_uint<2> > dc_op;
//
//Instance declaration
scpu_fetch   scpu_fetch_inst;
scpu_decoder scpu_decoder_inst;
scpu_execute scpu_execute_inst;
//
SC_CTOR (scpu_top) : scpu_fetch_inst("scpu_fetch_inst"), scpu_decoder_inst("scpu_decoder_inst"), scpu_execute_inst("scpu_execute_inst"){
  //instance connection of scpu_fetch_inst
      scpu_fetch_inst.clk(clk);
      scpu_fetch_inst.rst_n(rst_n);
      scpu_fetch_inst.dc_load_pc(dc_load_pc);
      scpu_fetch_inst.dc_imm(dc_imm);
      scpu_fetch_inst.dc_addr_sel(dc_addr_sel);
      scpu_fetch_inst.dc_rs(dc_rs);
      scpu_fetch_inst.dc_rd(dc_rd);
      scpu_fetch_inst.dc_mem_wr(dc_mem_wr);
      scpu_fetch_inst.dc_load_dr(dc_load_dr);
      scpu_fetch_inst.dc_load_ir(dc_load_ir);
      scpu_fetch_inst.fetch_ir(fetch_ir);
      scpu_fetch_inst.fetch_dr(fetch_dr);
      scpu_fetch_inst.fetch_mem_dout(fetch_mem_dout);
  //instance connection of scpu_decoder_inst
  scpu_decoder_inst.clk(clk);
  scpu_decoder_inst.rst_n(rst_n);
  scpu_decoder_inst.fetch_ir(fetch_ir);
  scpu_decoder_inst.fetch_dr(fetch_dr);
  scpu_decoder_inst.fetch_mem_dout(fetch_mem_dout);
  scpu_decoder_inst.ex_dout(ex_dout);
  scpu_decoder_inst.dc_load_pc(dc_load_pc);
  scpu_decoder_inst.dc_imm(dc_imm);
  scpu_decoder_inst.dc_addr_sel(dc_addr_sel);
  scpu_decoder_inst.dc_rs(dc_rs);
  scpu_decoder_inst.dc_rd(dc_rd);
  scpu_decoder_inst.dc_mem_wr(dc_mem_wr);
  scpu_decoder_inst.dc_load_dr(dc_load_dr);
  scpu_decoder_inst.dc_load_ir(dc_load_ir);
  scpu_decoder_inst.dc_op(dc_op);
//instance connection of scpu_execute_inst
     scpu_execute_inst.dc_rs(dc_rs);
     scpu_execute_inst.dc_rd(dc_rd);
     scpu_execute_inst.dc_op(dc_op);
     scpu_execute_inst.ex_dout(ex_dout);
}
};

Hình 1: TOP module của SCPU
Kết thúc bài này, chúng ta đã có thể tạo được tất cả các file code của ví dụ SCPU. Nhóm tác giả sẽ đưa link tải source code hoàn chỉnh trong những bài sau. Hiện tại, các bạn có thể tự viết model code của mình và hãy phản hồi cho chúng tôi nếu gặp bất cứ vấn đề gì.

Lịch sử cập nhật:
1. 2019.Apr.21 - Tạo lần đầu

Danh sách tác giả:
1. Lê Hoàng Vân
2. Trương Công Hoàng Việt
3. Nguyễn Hùng Quân

0 bình luận:

Đăng nhận xét