Skip to content

Commit b55b555

Browse files
committed
Adding umi/apb device
- Showing that optimizing for silly low performance bus is dumb, registers dominate area.
1 parent efc66a3 commit b55b555

4 files changed

Lines changed: 92 additions & 25 deletions

File tree

logikbench/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181

8282
# Blocks
8383
from .blocks.aes.aes import Aes
84+
from .blocks.apbdev.apbdev import Apbdev
8485
from .blocks.axicrossbar.axicrossbar import Axicrossbar
8586
from .blocks.ethmac.ethmac import Ethmac
8687
from .blocks.fft.fft import Fft
@@ -92,10 +93,9 @@
9293
from .blocks.picorv32.picorv32 import Picorv32
9394
from .blocks.serv.serv import Serv
9495
from .blocks.uart.uart import Uart
95-
96+
from .blocks.umidev.umidev import Umidev
9697

9798
# EPFL
98-
9999
from .epfl.adder.adder import Adder
100100
from .epfl.arbiter.arbiter import Arbiter
101101
from .epfl.bar.bar import Bar

logikbench/blocks/apbdev/apbdev.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from os.path import dirname, abspath
2+
from siliconcompiler.design import DesignSchema
3+
4+
5+
class Apbdev(DesignSchema):
6+
def __init__(self):
7+
8+
name = 'apbdev'
9+
root = f'{name}_root'
10+
source = [f'rtl/{name}.v']
11+
12+
# create a Design object
13+
super().__init__(name)
14+
15+
# set data home directory
16+
self.register_package(root, dirname(abspath(__file__)))
17+
18+
# rtl files
19+
fileset = 'rtl'
20+
for item in source:
21+
self.add_file(item, fileset, package=root)
22+
23+
# top module
24+
self.set_topmodule(name, fileset)
25+
26+
if __name__ == "__main__":
27+
d = Apbdev()
28+
d.write_fileset(f"apbdev.f", fileset="rtl")
Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1-
module apbdev();
2-
//complete code
1+
module apbdev
2+
#(parameter AW = 32, // architecture address width
3+
parameter RW = 32, // reg width
4+
parameter RAW = 5 // reg address width
5+
)
6+
(input nreset, // async active low
7+
input apb_pclk, // apb clock
8+
input [RAW-1:0] apb_paddr, // address bus
9+
input apb_penable, // goes high for cycle 2:n
10+
input apb_pwrite, // 1=write, 0=read
11+
input [RW-1:0] apb_pwdata, // write data (8, 16, 32b)
12+
input [3:0] apb_pstrb, // (optional) wire strobe bytelanes
13+
input [2:0] apb_pprot, // (optional) level of access
14+
input apb_psel, // select signal for each device
15+
output apb_pready, // device "wait" signal
16+
output reg [RW-1:0] apb_prdata // read data (8, 16, 32b)
17+
);
18+
19+
reg [RW-1:0] regs [(2**RAW)-1:0];
20+
21+
// apb interface
22+
assign reg_write = apb_psel & apb_penable & apb_pwrite;
23+
assign reg_read = apb_psel & ~apb_penable & ~apb_pwrite;
24+
assign apb_pready = 1'b1;
25+
26+
// register access
27+
always @(posedge apb_pclk) begin
28+
if (reg_write)
29+
regs[apb_paddr] <= apb_pwdata;
30+
apb_prdata <= regs[apb_paddr];
31+
end
32+
333
endmodule

logikbench/blocks/umidev/rtl/umidev.v

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@
2626
* address range by setting the GRPOFFSET, GRPAW, and GRPID parameter.
2727
* The address range [GRPOFFSET+:GRPAW] is checked against GRPID for a
2828
* match. To disable the check, set the GRPAW to 0.
29+
* - Modified from original umi_regif code to add an array of registers
2930
*
3031
*****************************************************************************/
3132
module umidev
3233
#(parameter RW = 32, // register data width (RW<=DW)
33-
parameter RAW = 32, // register address width (RAW<=AW)
34+
parameter RAW = 5, // register address width (RAW<=AW)
3435
parameter GRPOFFSET = 24, // group address offset
3536
parameter GRPAW = 0, // group address width
3637
parameter GRPID = 0, // group ID
@@ -55,32 +56,34 @@ module umidev
5556
output reg [AW-1:0] udev_resp_dstaddr,
5657
output reg [AW-1:0] udev_resp_srcaddr,
5758
output reg [DW-1:0] udev_resp_data,
58-
input udev_resp_ready,
59-
// single-port register interface
60-
output reg_write, // write enable
61-
output reg_read, // read request
62-
output [RAW-1:0] reg_addr, // address
63-
output [RW-1:0] reg_wdata, // write data
64-
output [1:0] reg_prot, // protection
65-
input [RW-1:0] reg_rdata, // read data
66-
input [1:0] reg_err, // device error
67-
input reg_ready // device is ready
59+
input udev_resp_ready
6860
);
6961

7062
`include "umi_messages.vh"
7163

7264
// local state
7365
reg udev_req_safe_ready;
74-
66+
reg [RW-1:0] regs [(2**RAW)-1:0];
7567

7668
// local wires
77-
wire [CW-1:0] resp_cmd;
78-
wire cmd_read;
79-
wire cmd_write;
80-
wire cmd_posted;
81-
wire cmd_atomic;
82-
wire match;
83-
wire beat;
69+
wire [CW-1:0] resp_cmd;
70+
wire cmd_read;
71+
wire cmd_write;
72+
wire cmd_posted;
73+
wire cmd_atomic;
74+
wire match;
75+
wire beat;
76+
wire reg_ready;
77+
wire [1:0] reg_err;
78+
wire [RAW-1:0] reg_addr;
79+
wire [RW-1:0] reg_wdata;
80+
wire [RW-1:0] reg_rdata;
81+
82+
//######################################
83+
// Constants
84+
//######################################
85+
assign reg_ready = 1'b1;
86+
assign reg_err[1:0] = 2'b00;
8487

8588
//######################################
8689
// UMI Request
@@ -118,14 +121,20 @@ module umidev
118121
assign beat = udev_req_valid & udev_req_ready;
119122

120123
//######################################
121-
// Register Interface
124+
// Register Access
122125
//######################################
123126

124127
assign reg_write = (cmd_write | cmd_posted) & beat;
125128
assign reg_read = cmd_read & beat;
126129
assign reg_addr[RAW-1:0] = udev_req_dstaddr[RAW-1:0];
127130
assign reg_wdata[RW-1:0] = udev_req_data[RW-1:0];
128-
assign reg_prot[1:0] = udev_req_cmd[21:20];
131+
132+
always @(posedge clk) begin
133+
if (reg_write)
134+
regs[reg_addr] <= reg_wdata[RW-1:0];
135+
end
136+
137+
assign reg_rdata = regs[reg_addr];
129138

130139
//######################################
131140
// UMI Response

0 commit comments

Comments
 (0)