blob: e58737b3630156d8cccb4c031a3398bcf5f54910 (
plain)
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
|
module axilemu
import axilemu_if_pkg::*;
(
input logic clk,
rst_n,
if_axil.s agent,
driver,
output logic irq
);
axi4lite_intf #(.ADDR_WIDTH(AXILEMU_IF_MIN_ADDR_WIDTH)) regblock();
axilemu_if__in_t if_in;
axilemu_if__out_t if_out;
assign agent.rdata = if_out.R.DATA.value;
assign agent.bvalid = if_out.B.VALID.value;
assign if_in.CTRL.BDONE.hwset = agent.bvalid & agent.bready;
assign if_in.CTRL.RDONE.hwset = agent.rvalid & agent.rready;
assign if_in.CTRL.WVALID.next = agent.wvalid;
assign if_in.CTRL.ARVALID.next = agent.arvalid;
assign if_in.CTRL.AWVALID.next = agent.awvalid;
assign if_in.AR.ADDR.next = agent.araddr[31:2];
assign if_in.AR.VALID.hwset = agent.arvalid & ~agent.arready & ~if_out.AR.VALID.value;
assign if_in.AW.ADDR.next = agent.awaddr[31:2];
assign if_in.AW.VALID.hwset = agent.awvalid & ~agent.awready & ~if_out.AW.VALID.value;
assign if_in.W.DATA.next = agent.wdata;
assign if_in.B.VALID.hwclr = agent.bvalid & agent.bready;
if_axil2regblock axil2regblock
(
.axis(driver),
.axim(regblock.master)
);
axilemu_if regif
(
.clk,
.arst_n(rst_n),
.s_axil(regblock.slave),
.hwif_in(if_in),
.hwif_out(if_out)
);
always_ff @(posedge clk or negedge rst_n)
if (~rst_n) begin
irq <= 0;
agent.rvalid <= 0;
agent.wready <= 0;
agent.arready <= 0;
agent.awready <= 0;
end else begin
irq <= (if_out.CTRL.ARINT.value & agent.arvalid)
| (if_out.CTRL.AWINT.value & agent.awvalid);
agent.rvalid <= if_out.R.DATA.swmod | (agent.rvalid & ~agent.rready);
agent.wready <= agent.wvalid & if_out.W.DATA.swacc;
agent.arready <= agent.arvalid & if_out.AR.VALID.swmod;
agent.awready <= agent.awvalid & if_out.AW.VALID.swmod;
end
endmodule
|