Skip to content

Commit a0d1529

Browse files
committed
Introduce width parameter
Expose the width (or W internally) parameter to set the SERV datapath width. Note: Only width=1 is function at this time.
1 parent 1c5d44e commit a0d1529

File tree

9 files changed

+79
-51
lines changed

9 files changed

+79
-51
lines changed

bench/servant_sim.v

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module servant_sim
88

99
parameter memfile = "";
1010
parameter memsize = 8192;
11+
parameter width = 1;
1112
parameter with_csr = 1;
1213
parameter compressed = 0;
1314
parameter align = compressed;
@@ -22,6 +23,7 @@ module servant_sim
2223
servant
2324
#(.memfile (memfile),
2425
.memsize (memsize),
26+
.width (width),
2527
.sim (1),
2628
.with_csr (with_csr),
2729
.compress (compressed[0:0]),

bench/servant_tb.v

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@ module servant_tb;
33

44
parameter memfile = "hello_uart.hex";
55
parameter memsize = 8192;
6+
parameter width = 1;
67
parameter with_csr = 1;
78

9+
localparam baud_rate =
10+
(width == 4) ? 57600*3 :
11+
57600;
12+
813
reg wb_clk = 1'b0;
914
reg wb_rst = 1'b1;
1015

@@ -15,11 +20,12 @@ module servant_tb;
1520

1621
vlog_tb_utils vtu();
1722

18-
uart_decoder #(57600) uart_decoder (q);
23+
uart_decoder #(baud_rate) uart_decoder (q);
1924

2025
servant_sim
2126
#(.memfile (memfile),
2227
.memsize (memsize),
28+
.width (width),
2329
.with_csr (with_csr))
2430
dut
2531
(.wb_clk (wb_clk),

data/verilator_waiver.vlt

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
`verilator_config
22
// Bits [1:0] in i_wb_rdt are not used at all
3-
lint_off -rule UNUSED -file "*/serv_top.v" -lines 179
3+
lint_off -rule UNUSED -file "*/serv_top.v" -lines 181
44

55
//Some bits in the instruction word are not used in serv_decode but it's easier
66
//to just send in the whole word than picking out bits
77
lint_off -rule UNUSED -file "*/serv_decode.v" -lines 8
88

9-
lint_off -rule UNUSED -file "*/serv_top.v" -lines 177
10-
119
//Some variables are only used when we connect an Extension with serv_decode
12-
lint_off -rule UNUSED -file "*/serv_top.v" -lines 67
10+
lint_off -rule UNUSED -file "*/serv_top.v" -lines 69
1311

1412

rtl/serv_rf_top.v

+10-7
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ module serv_rf_top
2828
*/
2929
parameter RESET_STRATEGY = "MINI",
3030
parameter WITH_CSR = 1,
31-
parameter RF_WIDTH = 2,
31+
parameter W = 1,
32+
parameter RF_WIDTH = W * 2,
3233
parameter RF_L2D = $clog2((32+(WITH_CSR*4))*32/RF_WIDTH))
3334
(
3435
input wire clk,
@@ -86,13 +87,13 @@ module serv_rf_top
8687
wire [4+WITH_CSR:0] wreg1;
8788
wire wen0;
8889
wire wen1;
89-
wire wdata0;
90-
wire wdata1;
90+
wire [W-1:0] wdata0;
91+
wire [W-1:0] wdata1;
9192
wire [4+WITH_CSR:0] rreg0;
9293
wire [4+WITH_CSR:0] rreg1;
9394
wire rf_ready;
94-
wire rdata0;
95-
wire rdata1;
95+
wire [W-1:0] rdata0;
96+
wire [W-1:0] rdata1;
9697

9798
wire [RF_L2D-1:0] waddr;
9899
wire [RF_WIDTH-1:0] wdata;
@@ -104,7 +105,8 @@ module serv_rf_top
104105
serv_rf_ram_if
105106
#(.width (RF_WIDTH),
106107
.reset_strategy (RESET_STRATEGY),
107-
.csr_regs (CSR_REGS))
108+
.csr_regs (CSR_REGS),
109+
.W(W))
108110
rf_ram_if
109111
(.i_clk (clk),
110112
.i_rst (i_rst),
@@ -147,7 +149,8 @@ module serv_rf_top
147149
.WITH_CSR (WITH_CSR),
148150
.MDU(MDU),
149151
.COMPRESSED(COMPRESSED),
150-
.ALIGN(ALIGN))
152+
.ALIGN(ALIGN),
153+
.W(W))
151154
cpu
152155
(
153156
.clk (clk),

rtl/serv_top.v

+37-31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
module serv_top
44
#(parameter WITH_CSR = 1,
5+
parameter W = 1,
6+
parameter B = W-1,
57
parameter PRE_REGISTER = 1,
68
parameter RESET_STRATEGY = "MINI",
79
parameter RESET_PC = 32'd0,
@@ -43,12 +45,12 @@ module serv_top
4345
output wire [4+WITH_CSR:0] o_wreg1,
4446
output wire o_wen0,
4547
output wire o_wen1,
46-
output wire o_wdata0,
47-
output wire o_wdata1,
48+
output wire [B:0] o_wdata0,
49+
output wire [B:0] o_wdata1,
4850
output wire [4+WITH_CSR:0] o_rreg0,
4951
output wire [4+WITH_CSR:0] o_rreg1,
50-
input wire i_rdata0,
51-
input wire i_rdata1,
52+
input wire [B:0] i_rdata0,
53+
input wire [B:0] i_rdata1,
5254

5355
output wire [31:0] o_ibus_adr,
5456
output wire o_ibus_cyc,
@@ -92,18 +94,18 @@ module serv_top
9294
wire rd_alu_en;
9395
wire rd_csr_en;
9496
wire rd_mem_en;
95-
wire ctrl_rd;
96-
wire alu_rd;
97-
wire mem_rd;
98-
wire csr_rd;
97+
wire [B:0] ctrl_rd;
98+
wire [B:0] alu_rd;
99+
wire [B:0] mem_rd;
100+
wire [B:0] csr_rd;
99101
wire mtval_pc;
100102

101103
wire ctrl_pc_en;
102104
wire jump;
103105
wire jal_or_jalr;
104106
wire utype;
105107
wire mret;
106-
wire imm;
108+
wire [B:0] imm;
107109
wire trap;
108110
wire pc_rel;
109111
wire iscomp;
@@ -127,8 +129,8 @@ module serv_top
127129
wire bufreg_rs1_en;
128130
wire bufreg_imm_en;
129131
wire bufreg_clr_lsb;
130-
wire bufreg_q;
131-
wire bufreg2_q;
132+
wire [B:0] bufreg_q;
133+
wire [B:0] bufreg2_q;
132134
wire [31:0] dbus_rdt;
133135
wire dbus_ack;
134136

@@ -139,11 +141,11 @@ module serv_top
139141
wire alu_cmp;
140142
wire [2:0] alu_rd_sel;
141143

142-
wire rs1;
143-
wire rs2;
144+
wire [B:0] rs1;
145+
wire [B:0] rs2;
144146
wire rd_en;
145147

146-
wire op_b;
148+
wire [B:0] op_b;
147149
wire op_b_sel;
148150

149151
wire mem_signed;
@@ -156,20 +158,20 @@ module serv_top
156158

157159
wire mem_misalign;
158160

159-
wire bad_pc;
161+
wire [B:0] bad_pc;
160162

161163
wire csr_mstatus_en;
162164
wire csr_mie_en;
163165
wire csr_mcause_en;
164166
wire [1:0] csr_source;
165-
wire csr_imm;
167+
wire [B:0] csr_imm;
166168
wire csr_d_sel;
167169
wire csr_en;
168170
wire [1:0] csr_addr;
169-
wire csr_pc;
171+
wire [B:0] csr_pc;
170172
wire csr_imm_en;
171-
wire csr_in;
172-
wire rf_csr_out;
173+
wire [B:0] csr_in;
174+
wire [B:0] rf_csr_out;
173175
wire dbus_en;
174176

175177
wire new_irq;
@@ -226,7 +228,8 @@ module serv_top
226228
#(.RESET_STRATEGY (RESET_STRATEGY),
227229
.WITH_CSR (WITH_CSR[0:0]),
228230
.MDU(MDU),
229-
.ALIGN(ALIGN))
231+
.ALIGN(ALIGN),
232+
.W(W))
230233
state
231234
(
232235
.i_clk (clk),
@@ -420,7 +423,8 @@ module serv_top
420423
serv_ctrl
421424
#(.RESET_PC (RESET_PC),
422425
.RESET_STRATEGY (RESET_STRATEGY),
423-
.WITH_CSR (WITH_CSR))
426+
.WITH_CSR (WITH_CSR),
427+
.W (W))
424428
ctrl
425429
(
426430
.clk (clk),
@@ -447,7 +451,7 @@ module serv_top
447451
//External
448452
.o_ibus_adr (wb_ibus_adr));
449453

450-
serv_alu alu
454+
serv_alu #(.W (W)) alu
451455
(
452456
.clk (clk),
453457
//State
@@ -467,7 +471,7 @@ module serv_top
467471
.o_rd (alu_rd));
468472

469473
serv_rf_if
470-
#(.WITH_CSR (WITH_CSR))
474+
#(.WITH_CSR (WITH_CSR), .W(W))
471475
rf_if
472476
(//RF interface
473477
.i_cnt_en (cnt_en),
@@ -485,7 +489,7 @@ module serv_top
485489
//Trap interface
486490
.i_trap (trap),
487491
.i_mret (mret),
488-
.i_mepc (wb_ibus_adr[0]),
492+
.i_mepc (wb_ibus_adr[B:0]),
489493
.i_mtval_pc (mtval_pc),
490494
.i_bufreg_q (bufreg_q),
491495
.i_bad_pc (bad_pc),
@@ -516,7 +520,8 @@ module serv_top
516520
.o_csr (rf_csr_out));
517521

518522
serv_mem_if
519-
#(.WITH_CSR (WITH_CSR[0:0]))
523+
#(.WITH_CSR (WITH_CSR[0:0]),
524+
.W (W))
520525
mem_if
521526
(
522527
.i_clk (clk),
@@ -539,7 +544,8 @@ module serv_top
539544
generate
540545
if (|WITH_CSR) begin : gen_csr
541546
serv_csr
542-
#(.RESET_STRATEGY (RESET_STRATEGY))
547+
#(.RESET_STRATEGY (RESET_STRATEGY),
548+
.W(W))
543549
csr
544550
(
545551
.i_clk (clk),
@@ -574,8 +580,8 @@ module serv_top
574580
.i_rs1 (rs1),
575581
.o_q (csr_rd));
576582
end else begin : gen_no_csr
577-
assign csr_in = 1'b0;
578-
assign csr_rd = 1'b0;
583+
assign csr_in = {W{1'b0}};
584+
assign csr_rd = {W{1'b0}};
579585
assign new_irq = 1'b0;
580586
end
581587
endgenerate
@@ -597,7 +603,7 @@ module serv_top
597603

598604
/* Store data written to rd */
599605
if (o_wen0)
600-
rvfi_rd_wdata <= {o_wdata0,rvfi_rd_wdata[31:1]};
606+
rvfi_rd_wdata <= {o_wdata0,rvfi_rd_wdata[31:W]};
601607

602608
if (cnt_done & ctrl_pc_en) begin
603609
rvfi_pc_rdata <= pc;
@@ -626,8 +632,8 @@ module serv_top
626632
rvfi_rd_addr <= rd_addr;
627633
end
628634
if (rs_en) begin
629-
rvfi_rs1_rdata <= {!immdec_en[1] & rs1,rvfi_rs1_rdata[31:1]};
630-
rvfi_rs2_rdata <= {!immdec_en[2] & rs2,rvfi_rs2_rdata[31:1]};
635+
rvfi_rs1_rdata <= {(!immdec_en[1] ? rs1 : {W{1'b0}}),rvfi_rs1_rdata[31:W]};
636+
rvfi_rs2_rdata <= {(!immdec_en[2] ? rs2 : {W{1'b0}}),rvfi_rs2_rdata[31:W]};
631637
end
632638

633639
if (i_dbus_ack) begin

servant.core

+7
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ targets:
580580
filesets : [soc, servant_tb]
581581
parameters :
582582
- RISCV_FORMAL
583+
- width
583584
- "mdu? (MDU=1)"
584585
- SERV_CLEAR_RAM=true
585586
- firmware
@@ -649,6 +650,7 @@ targets:
649650
- uart_baudrate
650651
- vcd
651652
- vcd_start
653+
- width
652654
- compressed
653655
- align
654656
- with_csr=1
@@ -744,6 +746,11 @@ parameters:
744746
description : Delay start of VCD dumping until the specified time
745747
paramtype : plusarg
746748

749+
width:
750+
datatype : int
751+
description : Interal datapath width (1=SERV, 4=QERV)
752+
paramtype : vlogparam
753+
747754
with_csr:
748755
datatype : int
749756
description : Enable/Disable CSR support

servant/servant.v

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module servant
88
parameter memfile = "zephyr_hello.hex";
99
parameter memsize = 8192;
1010
parameter reset_strategy = "MINI";
11+
parameter width = 1;
1112
parameter sim = 0;
1213
parameter with_csr = 1;
1314
parameter [0:0] compress = 0;
@@ -23,7 +24,7 @@ module servant
2324
localparam aw = $clog2(memsize);
2425
localparam csr_regs = with_csr*4;
2526

26-
localparam rf_width = 2;
27+
localparam rf_width = width * 2;
2728
localparam rf_l2d = $clog2((32+csr_regs)*32/rf_width);
2829

2930
wire timer_irq;
@@ -133,7 +134,7 @@ module servant
133134
.o_rdata (rf_rdata));
134135

135136
servile
136-
#(.rf_width (rf_width),
137+
#(.width (width),
137138
.sim (sim[0]),
138139
.with_c (compress[0]),
139140
.with_csr (with_csr[0]),
@@ -159,7 +160,7 @@ module servant
159160
.o_wb_ext_stb (wb_ext_stb),
160161
.i_wb_ext_rdt (wb_ext_rdt),
161162
.i_wb_ext_ack (wb_ext_ack),
162-
163+
163164
.o_rf_waddr (rf_waddr),
164165
.o_rf_wdata (rf_wdata),
165166
.o_rf_wen (rf_wen),

0 commit comments

Comments
 (0)