Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7fff9f3dc
|
||
|
|
c717bf189c
|
No files matched your search
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
// flags[0:0] = Cout
|
// flags[0:0] = Cout
|
||||||
// flags[1:1] = Overflow
|
// flags[1:1] = Overflow
|
||||||
|
// flags[2:2] = Zero
|
||||||
module alu #(parameter width=2)(input logic [3:0] op,
|
module alu #(parameter width=2)(input logic [3:0] op,
|
||||||
input logic [2**width-1:0] A, input logic [2**width-1:0] B,
|
input logic [2**width-1:0] A, input logic [2**width-1:0] B,
|
||||||
output logic [2**width-1:0] OUT_1, output logic[2:0] flags
|
output logic [2**width-1:0] OUT_1, output logic[2:0] flags
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
module assignment2 #(width=5, ramsz=9, romsz=10) (
|
module assignment2 #(width=5, ramsz=9, romsz=10) (
|
||||||
input logic [0:0] clk
|
input logic [0:0] clk, input logic [0:0] rst
|
||||||
`ifdef QUARTUS_SYNTH
|
`ifdef QUARTUS_SYNTH
|
||||||
,
|
,
|
||||||
input logic [4:0] HID_Register,
|
input logic [4:0] HID_Register,
|
||||||
@@ -56,12 +56,12 @@ module assignment2 #(width=5, ramsz=9, romsz=10) (
|
|||||||
logic [2**width-1:0] rd_alu;
|
logic [2**width-1:0] rd_alu;
|
||||||
logic [2**width-1:0] rt_alu;
|
logic [2**width-1:0] rt_alu;
|
||||||
|
|
||||||
instruction_counter #(width) PC (clk, pc_we, pc_addr_write, pc_addr);
|
instruction_counter #(width) PC (clk, rst, pc_we, pc_addr_write, pc_addr);
|
||||||
|
|
||||||
rom #(romsz, width) ROM (pc_addr, instruction);
|
rom #(romsz, width) ROM (pc_addr, instruction);
|
||||||
|
|
||||||
logic [2**width-1:0] rd_mem;
|
logic [2**width-1:0] rd_mem;
|
||||||
ram #(ramsz, width) RAM (clk, rd_alu, M2W, rt, rd_mem);
|
ram #(ramsz, width) RAM (clk, rst, rd_alu, M2W, rt, rd_mem);
|
||||||
|
|
||||||
control_unit CONTROL_UNIT (instruction[31:26], instruction[5:0],
|
control_unit CONTROL_UNIT (instruction[31:26], instruction[5:0],
|
||||||
M2R, M2W, B, ALU_FN, ALU_SRC, RDST, RW
|
M2R, M2W, B, ALU_FN, ALU_SRC, RDST, RW
|
||||||
|
|||||||
@@ -2,19 +2,17 @@
|
|||||||
`define INSTRUCTION_COUNTER_H
|
`define INSTRUCTION_COUNTER_H
|
||||||
|
|
||||||
module instruction_counter #(parameter width=5)(
|
module instruction_counter #(parameter width=5)(
|
||||||
input logic [0:0] clk, input logic [0:0] we,
|
input logic [0:0] clk, input logic [0:0] rst, input logic [0:0] we,
|
||||||
input logic [2**width-1:0] W,
|
input logic [2**width-1:0] W,
|
||||||
output logic [2**width-1:0] addr
|
output logic [2**width-1:0] addr
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [2**width-1:0] pc;
|
logic [2**width-1:0] pc;
|
||||||
|
|
||||||
initial begin
|
always_ff @(posedge clk or posedge rst) begin
|
||||||
pc = {(2**width){1'b0}};
|
if (rst) begin
|
||||||
end
|
pc <= {(2**width){1'b0}};
|
||||||
|
end else if (we) begin
|
||||||
always_ff @(posedge clk) begin
|
|
||||||
if (we) begin
|
|
||||||
pc <= W;
|
pc <= W;
|
||||||
end else begin
|
end else begin
|
||||||
pc <= pc + 4;
|
pc <= pc + 4;
|
||||||
|
|||||||
+6
-9
@@ -2,7 +2,7 @@
|
|||||||
`define RAM_H
|
`define RAM_H
|
||||||
|
|
||||||
module ram #(addrwidth=9, datawidth=5)(
|
module ram #(addrwidth=9, datawidth=5)(
|
||||||
input logic [0:0] clk,
|
input logic [0:0] clk, input logic [0:0] rst,
|
||||||
input logic [addrwidth-1:0] addr,
|
input logic [addrwidth-1:0] addr,
|
||||||
input logic [0:0] we,
|
input logic [0:0] we,
|
||||||
input logic [datawidth-1:0] data_in,
|
input logic [datawidth-1:0] data_in,
|
||||||
@@ -12,15 +12,12 @@ module ram #(addrwidth=9, datawidth=5)(
|
|||||||
// TODO: Make this byte-sized, NOT word-sized!
|
// TODO: Make this byte-sized, NOT word-sized!
|
||||||
logic [2**datawidth-1:0] mem[0:255];
|
logic [2**datawidth-1:0] mem[0:255];
|
||||||
|
|
||||||
// NOTE: Possible issue with assignments still pending by end of initial block
|
|
||||||
initial begin
|
|
||||||
for (integer ADDR = 0; ADDR < 256; ADDR = ADDR + 1) begin
|
|
||||||
mem[ADDR] <= 32'b0;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
always_ff @(posedge clk) begin
|
always_ff @(posedge clk) begin
|
||||||
if (we) begin
|
if (rst) begin
|
||||||
|
for (integer ADDR = 0; ADDR < 256; ADDR = ADDR + 1) begin
|
||||||
|
mem[ADDR] <= 32'b0;
|
||||||
|
end
|
||||||
|
end else if (we) begin
|
||||||
mem[addr] <= data_in;
|
mem[addr] <= data_in;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+9
-1
@@ -15,13 +15,20 @@
|
|||||||
|
|
||||||
module mips_tb();
|
module mips_tb();
|
||||||
logic [0:0] clk;
|
logic [0:0] clk;
|
||||||
assignment2 #(5) CPU (clk);
|
logic [0:0] rst;
|
||||||
|
assignment2 #(5) CPU (clk, rst);
|
||||||
|
|
||||||
initial clk = 0;
|
initial clk = 0;
|
||||||
|
initial rst = 0;
|
||||||
always #1 clk = ~clk;
|
always #1 clk = ~clk;
|
||||||
|
|
||||||
integer num_errors = 0;
|
integer num_errors = 0;
|
||||||
initial begin
|
initial begin
|
||||||
|
rst = 1;
|
||||||
|
#2;
|
||||||
|
rst = 0;
|
||||||
|
#2;
|
||||||
|
|
||||||
$dumpfile("output.vcd");
|
$dumpfile("output.vcd");
|
||||||
$dumpvars(0, clk);
|
$dumpvars(0, clk);
|
||||||
$dumpvars(1, CPU.REGS);
|
$dumpvars(1, CPU.REGS);
|
||||||
@@ -31,6 +38,7 @@ module mips_tb();
|
|||||||
$dumpvars(5, CPU.CONTROL_UNIT);
|
$dumpvars(5, CPU.CONTROL_UNIT);
|
||||||
$dumpvars(5, CPU.instruction);
|
$dumpvars(5, CPU.instruction);
|
||||||
$dumpvars(5, CPU.ALU);
|
$dumpvars(5, CPU.ALU);
|
||||||
|
$dumpvars(6, CPU.flags);
|
||||||
|
|
||||||
// Zero out lower registers
|
// Zero out lower registers
|
||||||
$display("Beginning MIPS tests");
|
$display("Beginning MIPS tests");
|
||||||
|
|||||||
Reference in new issue
Block a user