-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapbSlave.sv
75 lines (67 loc) · 1.79 KB
/
apbSlave.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Example APB Slave for testing APB Driver module
// SPDX-FileCopyrightText: © 2022 Aadi Desai <21363892+supleed2@users.noreply.github.com>
// SPDX-License-Identifier: Apache-2.0
`default_nettype none
/* verilator lint_off UNUSED */
module apbSlave
#(parameter int AWIDTH = 12
, parameter int DWIDTH = 32
, parameter int SWIDTH = DWIDTH/8
)(input var logic i_ck
, input var logic i_rst_n
, input var logic i_sel
, input var logic i_enable
, input var logic [AWIDTH-1:0] i_addr
, input var logic i_write
, input var logic [DWIDTH-1:0] i_wdata
, input var logic [SWIDTH-1:0] i_strb
, input var logic [2:0] i_prot
, output var logic [DWIDTH-1:0] o_rdata
, output var logic o_ready
, output var logic o_slverr
);
logic [DWIDTH-1:0] mem [4096];
logic [DWIDTH-1:0] wdata;
for (genvar i = 0; i < SWIDTH; i++) begin
assign wdata[8*i+7:8*i] = i_strb[i] ? i_wdata[8*i+7:8*i] : mem[i_addr][8*i+7:8*i];
end
enum bit [1:0]
{ SETUP
, WRITE
, READ
} STATE;
always_comb
case (STATE)
SETUP: begin
o_rdata = '0;
o_ready = '0;
o_slverr = '0;
end
WRITE: begin
o_rdata = '0;
o_ready = '1;
o_slverr = '0;
end
READ: begin
o_rdata = mem[i_addr];
o_ready = '1;
o_slverr = '0;
end
default: begin end
endcase
always_ff @(posedge i_ck)
if (i_rst_n == 0)
STATE <= SETUP;
else if (i_sel == 0)
STATE <= SETUP;
else
if (i_write == 0)
STATE <= READ;
else
STATE <= WRITE;
always_ff @(negedge i_ck)
if (STATE == WRITE) mem[i_addr] <= wdata;
else mem[i_addr] <= mem[i_addr];
endmodule
/* verilator lint_on UNUSED */
`resetall