Skip to content

Commit efafe2d

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 efafe2d

File tree

6 files changed

+68
-46
lines changed

6 files changed

+68
-46
lines changed

bench/servant_sim.v

Lines changed: 2 additions & 0 deletions
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]),

rtl/serv_rf_top.v

Lines changed: 10 additions & 7 deletions
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

Lines changed: 37 additions & 31 deletions
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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ targets:
649649
- uart_baudrate
650650
- vcd
651651
- vcd_start
652+
- width
652653
- compressed
653654
- align
654655
- with_csr=1
@@ -744,6 +745,11 @@ parameters:
744745
description : Delay start of VCD dumping until the specified time
745746
paramtype : plusarg
746747

748+
width:
749+
datatype : int
750+
description : Interal datapath width (1=SERV, 4=QERV)
751+
paramtype : vlogparam
752+
747753
with_csr:
748754
datatype : int
749755
description : Enable/Disable CSR support

servant/servant.v

Lines changed: 4 additions & 3 deletions
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),

servile/servile.v

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
`default_nettype none
99
module servile
1010
#(
11+
parameter width = 1,
1112
parameter reset_pc = 32'h00000000,
1213
parameter reset_strategy = "MINI",
13-
parameter rf_width = 8,
14+
parameter rf_width = 2*width,
1415
parameter [0:0] sim = 1'b0,
1516
parameter [0:0] with_c = 1'b0,
1617
parameter [0:0] with_csr = 1'b0,
1718
parameter [0:0] with_mdu = 1'b0,
1819
//Internally calculated. Do not touch
20+
parameter B = width-1,
1921
parameter regs = 32+with_csr*4,
2022
parameter rf_l2d = $clog2(regs*32/rf_width))
2123
(
@@ -78,13 +80,13 @@ module servile
7880
wire [$clog2(regs)-1:0] wreg1;
7981
wire wen0;
8082
wire wen1;
81-
wire wdata0;
82-
wire wdata1;
83+
wire [B:0] wdata0;
84+
wire [B:0] wdata1;
8385
wire [$clog2(regs)-1:0] rreg0;
8486
wire [$clog2(regs)-1:0] rreg1;
8587
wire rf_ready;
86-
wire rdata0;
87-
wire rdata1;
88+
wire [B:0] rdata0;
89+
wire [B:0] rdata1;
8890

8991
wire [31:0] mdu_rs1;
9092
wire [31:0] mdu_rs2;
@@ -149,6 +151,7 @@ module servile
149151

150152
serv_rf_ram_if
151153
#(.width (rf_width),
154+
.W (width),
152155
.reset_strategy (reset_strategy),
153156
.csr_regs (with_csr*4))
154157
rf_ram_if
@@ -196,6 +199,7 @@ module servile
196199
serv_top
197200
#(
198201
.WITH_CSR (with_csr?1:0),
202+
.W (width),
199203
.PRE_REGISTER (1'b1),
200204
.RESET_STRATEGY (reset_strategy),
201205
.RESET_PC (reset_pc),

0 commit comments

Comments
 (0)