Com sys lab/testing ALU

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
จากวิชา com sys lab

ในส่วนนี้เราจะหัดใช้ latch เพื่อทดสอบ ALU จากนั้นเราจะลองนำ ALU มาต่อกับ register file (มีให้) เพื่อทดลองส่งสัญญาณควบคุมการทำงานของระบบ

Latch

สร้าง module latch4 ที่มี port ดังนี้:

  • sc_in<sc_uint<4> > a;
  • sc_out<sc_uint<4> > b;
  • sc_in_clk clk;

โดย latch จะเปลี่ยนค่า output b ให้เท่ากับ input a เมื่อ clk เปลี่ยนค่าจาก 0 -> 1 (positive edge triggered) นอกจากนี้ใน module ให้เพิ่ม method get และ set สำหรับอ่านและเขียนค่า b โดยตรงด้วย (เพื่อเป็นการตั้งค่าเริ่มต้น)

Hint: ในการเลือก positive edge trigger นั้น ตอนใส่ clk ใน sensitive ให้ใส่ clk.pos() แทน

หมายเหตุ: ที่ลงท้ายว่า 4 เพราะจะเป็น latch 4 บิต (ในงานถัด ๆ ไปจะต้องทำ latch 8 บิตด้วย สำหรับ program counter)

จากนั้นให้นำ latch ไปต่อกับ ALU เพื่อทดสอบการทำงาน โดยมีแผนภาพการเชื่อมต่อดังนี้ (ด้านล่างเป็นตัวอย่างการทดสอบ op = 0 (add) )

    +-------+        +-------+
 +->| LATCH |------->|a     c|------+
 |  |       |        |  ALU  |      |
 |  +-------+    1-->|b   op |      |
 |     |             +-------+      |
 |    clk                  |        |
 |                         0        |
 +----------------------------------+

ด้านล่างเป็นตัวอย่าง signal ที่ควรเห็น (y=1 เอาหนึ่งไปบวกตลอด; ผลลัพธ์อยู่ที่ z) ควรเพิ่ม signal ของ zero flag ด้วย

Systemc-alu-latch.png

อ่านเพิ่มเติม:

Register file

เราได้เตรียม module register_file ไว้แล้ว (อยู่ตอนท้าย) ภายในจะเก็บ register ขนาด 4 บิต จำนวน 8 ตัว (หมายเลข 0 - 7) โดยมี port ดังนี้

        +-------------------+
       -|reg0          data0|-
       -|reg1          data1|-
        |                   |
       -|regw0              |
       -|dataw0             |
       -|write_enabled      |
        |         clk       |
        +-------------------+
                   |

การทำงาน

  • reg0 และ reg1 จะระบุหมายเลข register ที่ต้องการอ่าน ค่าของ register จะส่งออกมาที่ data0 และ data 1 ส่วนนี้เป็น level sensitive
  • ในการเขียน จะเป็น positive edge triggered (ด้วย clk) โดยถ้า write_enabled = 1 แล้ว จะเขียนค่า dataw0 ลงไปยัง register หมายเลข regw0 (เขียนเสร็จ ถ้ามีการอ่านค่า register นั้นอยู่ ก็จะมีการอัพเดททันที)

งานของคุณ นำ register file ไปใช้แทน latch ให้เขียนและอ่านกับ register หมายเลข 0

ไฟล์ registers.h

#ifndef REGISTERS_H_INCLUDED
#define REGISTERS_H_INCLUDED

#include "systemc.h"

SC_MODULE(register_file) {
  sc_in_clk clk;

  sc_in<sc_uint<3> > reg0;
  sc_in<sc_uint<3> > reg1;

  sc_out<sc_uint<4> > data0;
  sc_out<sc_uint<4> > data1;

  sc_in<sc_uint<3> > regw0;
  sc_in<sc_uint<4> > dataw0;
  sc_in<bool> write_enabled;

  sc_uint<4> registers[8];

  void load(sc_int<4> data[8]) {
    for(int i=0; i<8; i++)
      registers[i] = data[0];
    process_read();
  }

  sc_uint<4> get(int r) {
    return registers[r];
  }

  sc_uint<4> set(int r, sc_uint<4> val) {
    registers[r] = val;
  }

  void process_read() {
    data0.write(registers[reg0.read()]);
    data1.write(registers[reg1.read()]);
  }

  void process() {
    if(clk.posedge()) {
      if(write_enabled.read()) {
        registers[regw0.read()] = dataw0.read();
      }
    }
    process_read();
  }
  
  SC_CTOR(register_file) {
    SC_METHOD(process);
    sensitive << clk.pos();
    sensitive << reg0 << reg1;
  }
};
#endif