Skip to content

Commit b2040b2

Browse files
committed
hw: add OBI SoC control register file
1 parent 9f3e3ac commit b2040b2

File tree

6 files changed

+161
-54
lines changed

6 files changed

+161
-54
lines changed

Bender.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ sources:
3030

3131
- rtl/croc_pkg.sv
3232
- rtl/user_pkg.sv
33-
- rtl/soc_ctrl/soc_ctrl_reg_pkg.sv
33+
- rtl/soc_ctrl/soc_ctrl_regs_pkg.sv
3434
- rtl/gpio/gpio_reg_pkg.sv
3535
# add your design files containing anything but modules (packages) here
3636

@@ -39,7 +39,7 @@ sources:
3939
files:
4040
# Level 1
4141
- rtl/core_wrap.sv
42-
- rtl/soc_ctrl/soc_ctrl_reg_top.sv
42+
- rtl/soc_ctrl/soc_ctrl_regs.sv
4343
- rtl/gpio/gpio_reg_top.sv
4444
- rtl/gpio/gpio.sv
4545
# Level 2

croc.flist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,10 @@ ihp13/tc_clk.sv
155155
ihp13/tc_sram_impl.sv
156156
rtl/croc_pkg.sv
157157
rtl/user_pkg.sv
158-
rtl/soc_ctrl/soc_ctrl_reg_pkg.sv
158+
rtl/soc_ctrl/soc_ctrl_regs_pkg.sv
159159
rtl/gpio/gpio_reg_pkg.sv
160160
rtl/core_wrap.sv
161-
rtl/soc_ctrl/soc_ctrl_reg_top.sv
161+
rtl/soc_ctrl/soc_ctrl_regs.sv
162162
rtl/gpio/gpio_reg_top.sv
163163
rtl/gpio/gpio.sv
164164
rtl/croc_domain.sv

rtl/croc_domain.sv

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -467,57 +467,21 @@ module croc_domain import croc_pkg::*; #(
467467
);
468468

469469
// SoC Control
470-
reg_req_t soc_ctrl_reg_req;
471-
reg_rsp_t soc_ctrl_reg_rsp;
472-
473-
periph_to_reg #(
474-
.AW ( SbrObiCfg.AddrWidth ),
475-
.DW ( SbrObiCfg.DataWidth ),
476-
.BW ( 8 ),
477-
.IW ( SbrObiCfg.IdWidth ),
478-
.req_t ( reg_req_t ),
479-
.rsp_t ( reg_rsp_t )
480-
) i_soc_ctrl_translate (
481-
.clk_i,
482-
.rst_ni,
470+
logic fetch_en_reg;
471+
assign fetch_enable = fetch_en_i | fetch_en_reg;
483472

484-
.req_i ( soc_ctrl_obi_req.req ),
485-
.add_i ( soc_ctrl_obi_req.a.addr ),
486-
.wen_i ( ~soc_ctrl_obi_req.a.we ),
487-
.wdata_i ( soc_ctrl_obi_req.a.wdata ),
488-
.be_i ( soc_ctrl_obi_req.a.be ),
489-
.id_i ( soc_ctrl_obi_req.a.aid ),
490-
491-
.gnt_o ( soc_ctrl_obi_rsp.gnt ),
492-
.r_rdata_o ( soc_ctrl_obi_rsp.r.rdata ),
493-
.r_opc_o ( soc_ctrl_obi_rsp.r.err ),
494-
.r_id_o ( soc_ctrl_obi_rsp.r.rid ),
495-
.r_valid_o ( soc_ctrl_obi_rsp.rvalid ),
496-
497-
.reg_req_o ( soc_ctrl_reg_req ),
498-
.reg_rsp_i ( soc_ctrl_reg_rsp )
499-
);
500-
assign soc_ctrl_obi_rsp.r.r_optional = '0;
501-
502-
soc_ctrl_reg_pkg::soc_ctrl_reg2hw_t soc_ctrl_reg2hw;
503-
soc_ctrl_reg_pkg::soc_ctrl_hw2reg_t soc_ctrl_hw2reg;
504-
assign fetch_enable = soc_ctrl_reg2hw.fetchen.q | fetch_en_i;
505-
assign boot_addr = soc_ctrl_reg2hw.bootaddr.q;
506-
assign sram_impl = soc_ctrl_reg2hw.sram_dly;
507-
assign soc_ctrl_hw2reg = '0;
508-
509-
soc_ctrl_reg_top #(
510-
.reg_req_t ( reg_req_t ),
511-
.reg_rsp_t ( reg_rsp_t ),
512-
.BootAddrDefault ( SramBaseAddr )
473+
soc_ctrl_regs #(
474+
.obi_req_t ( sbr_obi_req_t ),
475+
.obi_rsp_t ( sbr_obi_rsp_t ),
476+
.BootAddrDefault ( SramBaseAddr )
513477
) i_soc_ctrl (
514478
.clk_i,
515479
.rst_ni,
516-
.reg_req_i ( soc_ctrl_reg_req ),
517-
.reg_rsp_o ( soc_ctrl_reg_rsp ),
518-
.reg2hw ( soc_ctrl_reg2hw ),
519-
.hw2reg ( soc_ctrl_hw2reg ),
520-
.devmode_i ( 1'b0 )
480+
.obi_req_i ( soc_ctrl_obi_req ),
481+
.obi_rsp_o ( soc_ctrl_obi_rsp ),
482+
.boot_addr_o ( boot_addr ),
483+
.fetch_en_o ( fetch_en_reg ),
484+
.sram_dly_o ( sram_impl )
521485
);
522486

523487
// UART

rtl/soc_ctrl/soc_ctrl_regs.sv

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
module soc_ctrl_regs #(
2+
parameter type obi_req_t = logic,
3+
parameter type obi_rsp_t = logic,
4+
parameter int unsigned BootAddrDefault = 32'h0
5+
) (
6+
input logic clk_i,
7+
input logic rst_ni,
8+
input obi_req_t obi_req_i,
9+
output obi_rsp_t obi_rsp_o,
10+
// To hardware
11+
output logic [31:0] boot_addr_o,
12+
output logic fetch_en_o,
13+
output logic sram_dly_o
14+
);
15+
16+
import soc_ctrl_regs_pkg::*;
17+
18+
// Registers
19+
logic [31:0] boot_addr_d, boot_addr_q;
20+
logic fetch_en_d, fetch_en_q;
21+
logic [31:0] core_status_d, core_status_q;
22+
logic boot_mode_d, boot_mode_q;
23+
logic sram_dly_d, sram_dly_q;
24+
25+
// Internal signals
26+
obi_req_t obi_req_d, obi_req_q;
27+
logic [31:0] rdata_d, rdata_q;
28+
logic err_d, err_q;
29+
30+
// Latch OBI request
31+
assign obi_req_d = obi_req_i;
32+
33+
// Output assignment
34+
assign boot_addr_o = boot_addr_q;
35+
assign fetch_en_o = fetch_en_q;
36+
assign sram_dly_o = sram_dly_q;
37+
38+
always_comb begin : obi_response
39+
obi_rsp_o = '0;
40+
obi_rsp_o.gnt = 1'b1;
41+
obi_rsp_o.rvalid = obi_req_q.req;
42+
obi_rsp_o.r.err = err_q;
43+
obi_rsp_o.r.rid = obi_req_q.a.aid;
44+
obi_rsp_o.r.rdata = rdata_q;
45+
end
46+
47+
always_comb begin : read_write_fsm
48+
rdata_d = '0;
49+
err_d = '0;
50+
boot_addr_d = boot_addr_q;
51+
fetch_en_d = fetch_en_q;
52+
core_status_d = core_status_q;
53+
boot_mode_d = boot_mode_q;
54+
sram_dly_d = sram_dly_q;
55+
56+
if (obi_req_i.req) begin
57+
58+
if (obi_req_i.a.we) begin : write
59+
automatic logic [31:0] wdata = obi_req_i.a.wdata;
60+
unique case (obi_req_i.a.addr[IntAddrWidth-1:0])
61+
SOC_CTRL_BOOTADDR_OFFSET: begin
62+
boot_addr_d = wdata;
63+
end
64+
SOC_CTRL_FETCHEN_OFFSET: begin
65+
fetch_en_d = wdata[0];
66+
end
67+
SOC_CTRL_CORESTATUS_OFFSET: begin
68+
core_status_d = wdata;
69+
end
70+
SOC_CTRL_BOOTMODE_OFFSET: begin
71+
boot_mode_d = wdata[0];
72+
end
73+
SOC_CTRL_SRAM_DLY_OFFSET: begin
74+
sram_dly_d = wdata[0];
75+
end
76+
default: begin
77+
err_d = 1'b1;
78+
end
79+
endcase
80+
81+
end else begin : read
82+
unique case (obi_req_i.a.addr[IntAddrWidth-1:0])
83+
SOC_CTRL_BOOTADDR_OFFSET: begin
84+
rdata_d = boot_addr_q;
85+
end
86+
SOC_CTRL_FETCHEN_OFFSET: begin
87+
rdata_d = {31'h0, fetch_en_q};
88+
end
89+
SOC_CTRL_CORESTATUS_OFFSET: begin
90+
rdata_d = core_status_q;
91+
end
92+
SOC_CTRL_BOOTMODE_OFFSET: begin
93+
rdata_d = {31'h0, boot_mode_q};
94+
end
95+
SOC_CTRL_SRAM_DLY_OFFSET: begin
96+
rdata_d = {31'b0, sram_dly_q};
97+
end
98+
default: begin
99+
err_d = 1'b1;
100+
end
101+
endcase
102+
end
103+
104+
end
105+
end
106+
107+
always_ff @(posedge clk_i or negedge rst_ni) begin
108+
if (~rst_ni) begin
109+
boot_addr_q <= BootAddrDefault;
110+
fetch_en_q <= '0;
111+
core_status_q <= '0;
112+
boot_mode_q <= '0;
113+
sram_dly_q <= '0;
114+
obi_req_q <= '0;
115+
rdata_q <= '0;
116+
err_q <= '0;
117+
end else begin
118+
boot_addr_q <= boot_addr_d;
119+
fetch_en_q <= fetch_en_d;
120+
core_status_q <= core_status_d;
121+
boot_mode_q <= boot_mode_d;
122+
sram_dly_q <= sram_dly_d;
123+
obi_req_q <= obi_req_d;
124+
rdata_q <= rdata_d;
125+
err_q <= err_d;
126+
end
127+
end
128+
129+
endmodule

rtl/soc_ctrl/soc_ctrl_regs_pkg.sv

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package soc_ctrl_regs_pkg;
2+
3+
// Internal address width. We only need 5 bits to
4+
// store the offsets of the five registers implemented.
5+
localparam int unsigned IntAddrWidth = 5;
6+
7+
// Register offsets
8+
parameter logic [IntAddrWidth-1:0] SOC_CTRL_BOOTADDR_OFFSET = 5'h00;
9+
parameter logic [IntAddrWidth-1:0] SOC_CTRL_FETCHEN_OFFSET = 5'h04;
10+
parameter logic [IntAddrWidth-1:0] SOC_CTRL_CORESTATUS_OFFSET = 5'h08;
11+
parameter logic [IntAddrWidth-1:0] SOC_CTRL_BOOTMODE_OFFSET = 5'h0c;
12+
parameter logic [IntAddrWidth-1:0] SOC_CTRL_SRAM_DLY_OFFSET = 5'h10;
13+
14+
endpackage

rtl/tb_croc_soc.sv

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ module tb_croc_soc #(
4444

4545
// Register addresses
4646
localparam bit [31:0] BootAddrAddr = croc_pkg::SocCtrlAddrOffset
47-
+ soc_ctrl_reg_pkg::SOC_CTRL_BOOTADDR_OFFSET;
47+
+ soc_ctrl_regs_pkg::SOC_CTRL_BOOTADDR_OFFSET;
4848
localparam bit [31:0] FetchEnAddr = croc_pkg::SocCtrlAddrOffset
49-
+ soc_ctrl_reg_pkg::SOC_CTRL_FETCHEN_OFFSET;
49+
+ soc_ctrl_regs_pkg::SOC_CTRL_FETCHEN_OFFSET;
5050
localparam bit [31:0] CoreStatusAddr = croc_pkg::SocCtrlAddrOffset
51-
+ soc_ctrl_reg_pkg::SOC_CTRL_CORESTATUS_OFFSET;
51+
+ soc_ctrl_regs_pkg::SOC_CTRL_CORESTATUS_OFFSET;
5252

5353
/////////////////////////////
5454
// Command Line Arguments //

0 commit comments

Comments
 (0)