@@ -29,6 +29,7 @@ module tb_memory_axi #(
29
29
`include " axi/typedef.svh"
30
30
31
31
`include " common_cells/assertions.svh"
32
+ `include " common_cells/registers.svh"
32
33
33
34
localparam int NumBytes = AxiDataWidth/ 8 ;
34
35
localparam int BusAlign = $clog2 (NumBytes);
@@ -80,18 +81,12 @@ module tb_memory_axi #(
80
81
.out (axi_wo_atomics_cut)
81
82
);
82
83
83
- logic mem_req;
84
- logic mem_gnt;
84
+ logic mem_req, mem_req_q;
85
85
logic [AxiAddrWidth- 1 : 0 ] mem_addr;
86
86
logic [AxiDataWidth- 1 : 0 ] mem_wdata;
87
87
logic [AxiDataWidth/ 8 - 1 : 0 ] mem_strb;
88
88
logic mem_we;
89
- logic mem_rvalid;
90
- logic [AxiDataWidth- 1 : 0 ] mem_rdata;
91
-
92
- // Testbench memory is always ready
93
- assign mem_gnt = 1'b1 ;
94
- assign mem_rvalid = 1'b1 ;
89
+ logic [AxiDataWidth- 1 : 0 ] mem_rdata_q;
95
90
96
91
axi_to_mem_intf # (
97
92
.ADDR_WIDTH (AxiAddrWidth),
@@ -105,14 +100,14 @@ module tb_memory_axi #(
105
100
.busy_o ( ),
106
101
.slv (axi_wo_atomics_cut),
107
102
.mem_req_o (mem_req),
108
- .mem_gnt_i (mem_gnt),
103
+ .mem_gnt_i (1'b1 ), // Always ready
109
104
.mem_addr_o (mem_addr),
110
105
.mem_wdata_o (mem_wdata),
111
106
.mem_strb_o (mem_strb),
112
107
.mem_atop_o ( ), // ATOPs are resolved before
113
108
.mem_we_o (mem_we),
114
- .mem_rvalid_i (mem_req ),
115
- .mem_rdata_i (mem_rdata )
109
+ .mem_rvalid_i (mem_req_q ),
110
+ .mem_rdata_i (mem_rdata_q )
116
111
);
117
112
118
113
import " DPI-C" function void tb_memory_read (
@@ -127,6 +122,9 @@ module tb_memory_axi #(
127
122
input bit strb[]
128
123
);
129
124
125
+ // Respond in the next cycle to the request.
126
+ `FF (mem_req_q, mem_req, '0 )
127
+
130
128
// Handle write requests on the mem bus.
131
129
always_ff @ (posedge clk_i) begin
132
130
if (rst_ni && mem_req) begin
@@ -144,14 +142,14 @@ module tb_memory_axi #(
144
142
end
145
143
end
146
144
147
- // Handle read requests combinatorial on the mem bus.
148
- always_comb begin
149
- mem_rdata = '0 ;
150
- if (mem_req) begin
145
+ // Handle read requests on the mem bus.
146
+ always_ff @ ( posedge clk_i) begin
147
+ mem_rdata_q < = '0 ;
148
+ if (rst_ni && mem_req) begin
151
149
automatic byte data[NumBytes];
152
150
tb_memory_read ((mem_addr >> BusAlign) << BusAlign, NumBytes, data);
153
151
for (int i = 0 ; i < NumBytes; i++ ) begin
154
- mem_rdata [i* 8 + : 8 ] = data[i];
152
+ mem_rdata_q [i* 8 + : 8 ] < = data[i];
155
153
end
156
154
end
157
155
end
0 commit comments