day89 - EDA Playground
Warning! This exercise has been opened in another tab; autosave has been disabled. Close this tab or refresh to reactivate.

 Languages & Libraries

 Tools & Simulators

 Examples

206


3
 
1
// Code your testbench here
2
// or browse Examples
3
204
 
1
`include "riscv_pkg.sv"
2
`include "riscv_fetch.sv"
3
`include "riscv_decode.sv"
4
`include "riscv_regfile.sv"
5
`include "riscv_execute.sv"
6
`include "riscv_dmem.sv"
7
`include "riscv_control.sv"
8
9
module riscv_top (
10
  input       wire        clk,
11
  input       wire        reset,
12
  
13
  output      wire        imem_psel_o,
14
  output      wire        imem_penable_o,
15
  output      wire[31:0]  imem_paddr_o,
16
  output      wire        imem_pwrite_o,
17
  output      wire[31:0]  imem_pwdata_o,
18
  input       wire        imem_pready_i,
19
  input       wire[31:0]  imem_prdata_i,
20
  
21
  output      wire        dmem_psel_o,
22
  output      wire        dmem_penable_o,
23
  output      wire[31:0]  dmem_paddr_o,
24
  output      wire        dmem_pwrite_o,
25
  output      wire[31:0]  dmem_pwdata_o,
26
  input       wire        dmem_pready_i,
27
  input       wire[31:0]  dmem_prdata_i
28
);
29
  
30
  wire          instr_done;
31
  wire          if_dec_valid;
32
  wire [31:0]   if_dec_instr;
33
  wire [31:0]   ex_if_pc;
34
  wire [4:0]    rs1;
35
  wire [4:0]    rs2;
36
  wire [4:0]    rd;
37
  wire [6:0]    op;
38
  wire [2:0]    funct3;
39
  wire [6:0]    funct7;
40
  logic         is_r_type;
41
  logic         is_i_type;
42
  logic         is_s_type;
43
  logic         is_b_type;
44
  logic         is_u_type;
45
  logic         is_j_type;
46
  logic[11:0]   i_type_imm;
47
  logic[11:0]   s_type_imm;
48
  logic[11:0]   b_type_imm;
49
  logic[19:0]   u_type_imm;
50
  logic[19:0]   j_type_imm;
51
  logic[1:0]    pc_sel;
52
  logic         op1_sel;
53
  logic[1:0]    op2_sel;
54
  logic[1:0]    wb_sel;
55
  logic         pc4_sel;
56
  logic         mem_wr;
57
  logic         cpr_en;
58
  logic         rf_en;
59
  logic[3:0]    alu_op;
60
  wire          rf_wr_en;
61
  wire[4:0]     rf_wr_addr;
62
  wire[31:0]    rf_wr_data;
63
  wire[4:0]     rf_rd_p0;
64
  wire[4:0]     rf_rd_p1;
65
  wire[31:0]    rf_rd_p0_data;
66
  wire[31:0]    rf_rd_p1_data;
67
  wire [31:0]   opr_a;
68
  wire [31:0]   opr_b;
69
  wire [3:0]    op_sel;
70
  wire [31:0]   ex_res;
71
  wire          ex_dmem_valid;
72
  wire[31:0]    ex_dmem_addr;
73
  wire[31:0]    ex_dmem_wdata;
74
  wire          ex_dmem_wnr;
75
  logic[31:0]   dmem_data;
76
  logic         dmem_done;
77
  logic[31:0]   imm_sign_ext;
78
  logic         mem_op;
79
  
80
  // Instantiate and connect all the submodules
81
  assign instr_done = dmem_done | ~mem_op;
82
  riscv_fetch FETCH (
83
    .clk                (clk),
84
    .reset              (reset),
85
    .instr_done_i       (instr_done),
86
    .psel_o             (imem_psel_o),
87
    .penable_o          (imem_penable_o),
88
    .paddr_o            (imem_paddr_o),
89
    .pwrite_o           (imem_pwrite_o),
90
    .pwdata_o           (imem_pwdata_o),
91
    .pready_i           (imem_pready_i),
92
    .prdata_i           (imem_prdata_i),
93
    .if_dec_valid_o     (if_dec_valid),
94
    .if_dec_instr_o     (if_dec_instr),
95
    .ex_if_pc_i         (ex_if_pc)
96
  );
97
  
98
  riscv_decode DECODE (
99
    .if_dec_instr_i     (if_dec_instr),
100
    .rs1_o              (rs1),
101
    .rs2_o              (rs2),
102
    .rd_o               (rd),
103
    .op_o               (op),
104
    .funct3_o           (funct3),
105
    .funct7_o           (funct7),
106
    .is_r_type_o        (is_r_type),
107
    .is_i_type_o        (is_i_type),
108
    .is_s_type_o        (is_s_type),
109
    .is_b_type_o        (is_b_type),
110
    .is_u_type_o        (is_u_type),
111
    .is_j_type_o        (is_j_type),
112
    .i_type_imm_o       (i_type_imm),
113
    .s_type_imm_o       (s_type_imm),
114
    .b_type_imm_o       (b_type_imm),
115
    .u_type_imm_o       (u_type_imm),
116
    .j_type_imm_o       (j_type_imm)
117
  );
118
  
119
  assign rf_wr_en = rf_en;
120
  assign rf_wr_addr = rd;
121
  assign rf_wr_data = wb_sel[0] ? ex_res :
122
    wb_sel[1] ? ex_if_pc + 32'h4 :
123
    dmem_data;
124
  
125
  riscv_regfile REGFILE (
126
    .clk                (clk),
127
    .reset              (reset),
128
    .rf_wr_en_i         (rf_wr_en),
129
    .rf_wr_addr_i       (rf_wr_addr),
130
    .rf_wr_data_i       (rf_wr_data),  
131
    .rf_rd_p0_i         (rf_rd_p0),
132
    .rf_rd_p1_i         (rf_rd_p1),
133
    .rf_rd_p0_data_o    (rf_rd_p0_data),
134
    .rf_rd_p1_data_o    (rf_rd_p1_data)
135
  );
136
  
137
  // Sign extend the immediate
138
  assign imm_sign_ext = (is_i_type) ? {{30{i_type_imm[11]}}, i_type_imm} :
139
                        (is_s_type) ? {{30{s_type_imm[11]}}, s_type_imm} :
140
                        (is_b_type) ? {{30{b_type_imm[11]}}, b_type_imm} :
141
                        (is_u_type) ? {{12{u_type_imm[19]}}, u_type_imm} :
142
                                      {{12{j_type_imm[19]}}, j_type_imm};
143
  
144
  // Send the correct data to the ALU
145
  assign opr_a = op1_sel ? imm_sign_ext : rf_rd_p0_data;
146
  
147
  assign opr_b = &op2_sel   ? rf_rd_p1_data :
148
                 op2_sel[0] ? imm_sign_ext :
149
                              ex_if_pc; 
150
  
151
  riscv_execute EXECUTE (
152
    .opr_a_i            (opr_a),
153
    .opr_b_i            (opr_b),
154
    .op_sel_i           (alu_op),
155
    .ex_res_o           (ex_res)
156
  );
157
  
158
  assign mem_op = is_s_type | (is_i_type & (op == 7'h3));
159
  
160
  assign dmem_valid = if_dec_valid & mem_op;
161
  assign ex_dmem_addr = ex_res;
162
  assign ex_dmem_wnr = mem_wr;
163
  assign ex_dmem_wdata = rf_rd_p0_data;
164
  
165
  riscv_dmem DMEM (
166
    .clk                (clk),
167
    .reset              (reset),  
168
    .ex_dmem_valid_i    (ex_dmem_valid), // Mem operation is valid
169
    .ex_dmem_addr_i     (ex_dmem_addr),
170
    .ex_dmem_wdata_i    (ex_dmem_wdata),
171
    .ex_dmem_wnr_i      (ex_dmem_wnr), // 1 - write, 0 - read
172
    .psel_o             (dmem_psel_o),
173
    .penable_o          (dmem_penable_o),
174
    .paddr_o            (dmem_paddr_o),
175
    .pwrite_o           (dmem_pwrite_o),
176
    .pwdata_o           (dmem_pwdata_o),
177
    .pready_i           (dmem_pready_i),
178
    .prdata_i           (dmem_prdata_i),
179
    .dmem_data_o        (dmem_data),
180
    .dmem_done_o        (dmem_done)
181
  );
182
  
183
  riscv_control CONTROL (
184
    .instr_funct3_i     (funct3),
185
    .instr_funct7_i     (funct7),
186
    .instr_op_i         (op),
187
    .is_r_type_i        (is_r_type),
188
    .is_i_type_i        (is_i_type),
189
    .is_s_type_i        (is_s_type),
190
    .is_b_type_i        (is_b_type),    
191
    .is_u_type_i        (is_u_type),
192
    .is_j_type_i        (is_j_type),
193
    .pc_sel_o           (pc_sel),
194
    .op1_sel_o          (op1_sel),
195
    .op2_sel_o          (op2_sel),
196
    .wb_sel_o           (wb_sel),
197
    .pc4_sel_o          (pc4_sel),
198
    .mem_wr_o           (mem_wr),
199
    .cpr_en_o           (/* TODO */),
200
    .rf_en_o            (rf_en),
201
    .alu_op_o           (alu_op)
202
  );
203
  
204
endmodule
132 views and 0 likes     
 
A single cycle RISC-V processor: RV32I Top - 3

A single cycle RISC-V processor: RV32I Top - 3

190:0