Com sys lab/testing ALU
- จากวิชา 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 ด้วย
อ่านเพิ่มเติม:
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 นั้นอยู่ ก็จะมีการอัพเดททันที)
ไฟล์ registers.h
#ifndef REGISTERS_H_INCLUDED
#define REGISTERS_H_INCLUDED
#include "systemc.h"
#include <cstdio>
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();
}
void process_read() {
data0.write(registers[reg0.read()]);
data1.write(registers[reg1.read()]);
}
void process_write() {
if(write_enabled.read()) {
registers[regw0.read()] = dataw0.read();
process_read();
}
}
SC_CTOR(register_file) {
SC_METHOD(process_read);
sensitive << reg0 << reg1;
SC_METHOD(process_write);
sensitive << clk.pos();
}
};
#endif