0% found this document useful (0 votes)
72 views5 pages

Fix Me Pls

The document describes a testbench module for a RISC-V processor core. It includes modules for the program counter, instruction memory, register file, ALU, data memory, control unit, and other components. The testbench initializes the instruction memory with sample instructions, sets up the clock and reset signals, and monitors the outputs of the processor core during simulation.

Uploaded by

Phan Tan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
72 views5 pages

Fix Me Pls

The document describes a testbench module for a RISC-V processor core. It includes modules for the program counter, instruction memory, register file, ALU, data memory, control unit, and other components. The testbench initializes the instruction memory with sample instructions, sets up the clock and reset signals, and monitors the outputs of the processor core during simulation.

Uploaded by

Phan Tan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

module testbench;

reg clk,reset;
wire [31:0]W_PC_out, instruction, W_RD1, W_RD2, W_m1, W_m2, W_ALUout, W_RDM;
R_Type_Roc DUT(reset, clk, W_PC_out, instruction, W_RD1, W_RD2, W_m1,
W_m2,W_ALUout);
always #5 clk=~clk;
initial begin
$monitor(" clk=%b reset=%b PC_out=%2d instruction=%b RD1=%d RD2=%d Wm1=%d
Wm2=%d Aluout=%d",clk,reset,W_PC_out,instruction,W_RD1, W_RD2, W_m1,
W_m2,W_ALUout);
clk=0; reset=1;
#10 reset=0;
#40 $finish;
end
endmodule

module R_Type_Roc(reset, clk, W_PC_out, instruction, W_RD1, W_RD2, W_m1,


W_m2,W_ALUout);
input clk,reset;
output [31:0]W_PC_out, instruction, W_RD1, W_RD2, W_m1, W_m2, W_ALUout;
wire [31:0]W_PC_in,W_PC_plus_1,W_Branch_add,W_MemtoReg,W_RDM;
wire PC_Src, RegWrite, ALU_Src, MemRead, MemWrite, RegDst, MemtoReg, Zero;
wire [2:0]ALUop;
wire [4:0]W_mux_13;
Program_Counter C1(clk, reset, W_PC_in, W_PC_out);
Adder32Bit C2(W_PC_out, 32'b1, W_PC_plus_1);
Mux_32_bit C3(W_PC_plus_1,W_m2, W_PC_in, PC_Src);
Adder32Bit C4(W_PC_plus_1, W_Branch_add, W_m2);
Instruction_Memory C5(W_PC_out, instruction, reset);
Mux_5_bit C13(instruction[20:16], instruction[15:11], W_mux_13, RegDst);
Register_File C6(instruction[25:21],instruction[20:16], W_mux_13, W_RD1, W_RD2,
W_MemtoReg, RegWrite);
Sign_Extension C7(instruction[15:0], W_Branch_add);
Mux_32_bit C8(W_RD2,W_Branch_add,W_m1, ALU_Src);
alu C9(ALUop,W_RD1,W_m1,W_ALUout,Zero);
Data_Memory C10(W_ALUout,W_RD2,W_RDM, MemRead, MemWrite);
Mux_32_bit C11(W_ALUout, W_RDM, W_MemtoReg, MemtoReg);
Control C12(clk,instruction[31:26],RegDst,Pc_Scr, MemRead, MemtoReg,ALUop,
MemWrite,ALU_Src,RegWrite);
endmodule

module
Control(clk,Op_intstruct,RegDst,PcScrc,MemRead,MemtoReg,ALUOp,MemWrite,ALUSrc,RegWr
ite);
input clk;
input [5:0] Op_intstruct;
output reg RegDst,PcScrc,MemRead,MemtoReg;
output reg [2:0] ALUOp;
output reg MemWrite,ALUSrc,RegWrite;
always @(posedge clk)
begin
RegDst=1;
PcScrc=0;
MemRead=0;
MemRead=0;
MemtoReg=0;
ALUOp =3'b000;
MemWrite=0;
ALUSrc=0;
RegWrite=1;
end
endmodule

module Program_Counter (clk, reset, PC_in, PC_out);


input clk, reset;
input [31:0] PC_in;
output reg [31:0] PC_out;
always @ (posedge clk or posedge reset)
begin
if(reset==1'b1)
PC_out<=0;
else
PC_out<=PC_in;
end
endmodule

module Adder32Bit(input1, input2, out); input [31:0] input1, input2;


output [31:0] out;
reg [31:0]out;
always@( input1 or input2)
begin
out <= input1 + input2;
end
endmodule

module alu(
input [2:0] alufn,
input [31:0] ra,
input [31:0] rb_or_imm,
output reg [31:0] aluout,
output reg zero);
parameter ALU_OP_ADD = 3'b000,
ALU_OP_SUB = 3'b001,
ALU_OP_AND = 3'b010,
ALU_OP_OR = 3'b011,
ALU_OP_NOT_A = 3'b100,
ALU_OP_LW = 3'b101,
ALU_OP_SW = 3'b110,
ALU_OP_BEQ = 3'b111;

always @(*)
begin
case(alufn)
ALU_OP_ADD : aluout = ra + rb_or_imm;
ALU_OP_SUB : aluout = ra - rb_or_imm;
ALU_OP_AND : aluout = ra & rb_or_imm;
ALU_OP_OR : aluout = ra | rb_or_imm;
ALU_OP_NOT_A : aluout = ~ ra;
ALU_OP_LW : aluout = ra + rb_or_imm;
ALU_OP_SW : aluout = ra + rb_or_imm;
ALU_OP_BEQ : begin
zero = (ra==rb_or_imm)?1'b1:1'b0;
aluout = ra - rb_or_imm;
end
endcase
end
endmodule
module Register_File (read_addr_1, read_addr_2, write_addr, read_data_1,
read_data_2, write_data, RegWrite);
input [4:0] read_addr_1, read_addr_2, write_addr;
input [31:0] write_data;
input RegWrite;
output reg [31:0] read_data_1, read_data_2;
reg [31:0] Regfile [31:0];
integer k;
initial begin
for (k=0; k<32; k=k+1)
begin
Regfile[k] = 32'd10;
end
Regfile[0]=11;
Regfile[1]=22;
Regfile[2]=33;
Regfile[3]=44;
end
//assign read_data_1 = Regfile[read_addr_1];
always @(read_data_1 or Regfile[read_addr_1])
begin
if (read_addr_1 == 0) read_data_1 = 0;
else read_data_1 = Regfile[read_addr_1];
end
//assign read_data_2 = Regfile[read_addr_2];
always @(read_data_2 or Regfile[read_addr_2])
begin
if (read_addr_2 == 0) read_data_2 = 0;
else read_data_2 = Regfile[read_addr_2];
end
always @(*)
begin
if (RegWrite == 1'b1) Regfile[write_addr] = write_data;
end
endmodule

module Data_Memory (addr, write_data, read_data, MemRead, MemWrite);


input [31:0] addr;
input [31:0] write_data;
output [31:0] read_data;
input MemRead, MemWrite;
reg [31:0] DMemory [63:0];
integer k;
assign read_data = (MemRead) ? DMemory[addr] : 32'bx;
initial begin
for (k=0; k<64; k=k+1)
begin
DMemory[k] = 32'b0;
end
end
always @(*)
begin
if (MemWrite) DMemory[addr] = write_data;
end
endmodule

module Sign_Extension (sign_in, sign_out);


input [15:0] sign_in;
output [31:0] sign_out;
assign sign_out[15:0]=sign_in[15:0];
assign sign_out[31:16]=sign_in[15]?16'b1111_1111_1111_1111:16'b0;
endmodule

module Mux_32_bit (in0, in1, mux_out, select);


parameter N = 32;
input [N-1:0] in0, in1;
output [N-1:0] mux_out;
input select;
assign mux_out = select? in1: in0 ;
endmodule

module Mux_5_bit (in0, in1, mux_out, select);


parameter N = 5;
input [N-1:0] in0, in1;
output [N-1:0] mux_out;
input select;
assign mux_out = select? in1: in0 ;
endmodule

module Instruction_Memory (read_address, instruction, reset);


input reset;
input [31:0] read_address;
output [31:0] instruction;
reg [31:0] Imemory [63:0];
integer k;
// I-MEM in this case is addressed by word, not by byte
assign instruction = Imemory[read_address];
always @(posedge reset)
begin
for (k=16; k<32; k=k+1)
begin
// here Out changes k=0 to k=16
Imemory[k] = 32'b0;
end
Imemory[0] = 32'b000000_00010_00001_00011_00000_000000;
//addi $t0, $zero, 32
Imemory[1] = 32'b000001_00010_00001_00011_00000_000000;
//addi $t1, $zero, 55
Imemory[2] = 32'b000010_00010_00001_00011_00000_000000;
//and $s0, $t0, $t1
Imemory[3] = 32'b000011_00010_00001_00011_00000_000000;
//or $s0, $t0, $t1
Imemory[4] = 32'b000000_00010_00001_00011_00000_000000;
//sw $s0, 4($zero)
Imemory[5] = 32'b10101100000010000000000000001000;
//sw $t0, 8($zero)
Imemory[6] = 32'b00000001000010011000100000100000;
//add $s1, $t0, $t1
Imemory[7] = 32'b00000001000010011001000000100010;
//sub $s2, $t0, $t1
Imemory[8] = 32'b00010010001100100000000000001001;
//beq $s1, $s2, error0
Imemory[9] = 32'b10001100000100010000000000000100;
//lw $s1, 4($zero)
Imemory[10]= 32'b00110010001100100000000001001000;
//andi $s2, $s1, 48
Imemory[11] =32'b00010010001100100000000000001001;
//beq $s1, $s2, error1
Imemory[12] =32'b10001100000100110000000000001000;
//lw $s3, 8($zero)
Imemory[13] =32'b00010010000100110000000000001010;
//beq $s0, $s3, error2
Imemory[14] =32'b00000010010100011010000000101010;
//slt $s4, $s2, $s1 (Last)
Imemory[15] =32'b00010010100000000000000000001111;
//beq $s4, $0, EXIT
Imemory[16] =32'b00000010001000001001000000100000;
//add $s2, $s1, $0
Imemory[17] =32'b00001000000000000000000000001110;
//j Last
Imemory[18] =32'b00100000000010000000000000000000;
//addi $t0, $0, 0(error0)
Imemory[19] =32'b00100000000010010000000000000000;
//addi $t1, $0, 0
Imemory[20] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[21] =32'b00100000000010000000000000000001;
//addi $t0, $0, 1(error1)
Imemory[22] =32'b00100000000010010000000000000001;
//addi $t1, $0, 1
Imemory[23] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[24] =32'b00100000000010000000000000000010;
//addi $t0, $0, 2(error2)
Imemory[25] =32'b00100000000010010000000000000010;
//addi $t1, $0, 2
Imemory[26] =32'b00001000000000000000000000011111;
//j EXIT
Imemory[27] =32'b00100000000010000000000000000011;
//addi $t0, $0, 3(error3)
Imemory[28] =32'b00100000000010010000000000000011;
//addi $t1, $0, 3
Imemory[29] =32'b00001000000000000000000000011111;
//j EXIT
end
endmodule

You might also like