Skip to content

Commit 60417aa

Browse files
committed
Ibex runs to completion. Allow unaligned transfers in saxi_to_host
1 parent 338cfe4 commit 60417aa

File tree

3 files changed

+74
-76
lines changed

3 files changed

+74
-76
lines changed

deepsocflow/rtl/dma_controller.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ module dma_controller #(
7979
A_X_DONE = 'hB,
8080
A_O_DONE = 'hC
8181
; // Max 16 registers
82-
(* mark_debug = "true" *) logic [12:0][AXI_DATA_WIDTH-1:0] cfg ;
82+
(* mark_debug = "true" *) logic [AXI_DATA_WIDTH-1:0] cfg [12:0];
8383

8484
// always_ff @(posedge clk) // PS READ (1 clock latency)
8585
// if (!rstn) {reg_rd_data} <= '0;

deepsocflow/rtl/sys/saxi_to_host.sv

Lines changed: 72 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -12,48 +12,48 @@ module saxi_to_host #(
1212
// ---------------- AXI4-Slave: Read Address ----------------
1313
input wire [AXI_ID_WIDTH-1:0] s_axi_arid,
1414
input wire [AXI_ADDR_WIDTH-1:0] s_axi_araddr,
15-
input wire [7:0] s_axi_arlen, // beats-1
15+
input wire [7:0] s_axi_arlen, // beats-1 (must be 0)
1616
input wire [2:0] s_axi_arsize, // must be 3'b010
1717
input wire [1:0] s_axi_arburst, // INCR only (2'b01)
1818
input wire s_axi_arvalid,
19-
output reg s_axi_arready,
19+
output logic s_axi_arready,
2020

2121
// ---------------- AXI4-Slave: Read Data --------------------
22-
output reg [AXI_ID_WIDTH-1:0] s_axi_rid,
23-
output reg [AXI_DATA_WIDTH-1:0] s_axi_rdata,
24-
output reg [1:0] s_axi_rresp, // OKAY=2'b00, SLVERR=2'b10
25-
output reg s_axi_rlast,
26-
output reg s_axi_rvalid,
22+
output logic [AXI_ID_WIDTH-1:0] s_axi_rid,
23+
output logic [AXI_DATA_WIDTH-1:0] s_axi_rdata,
24+
output logic [1:0] s_axi_rresp, // OKAY=2'b00, SLVERR=2'b10
25+
output logic s_axi_rlast,
26+
output logic s_axi_rvalid,
2727
input wire s_axi_rready,
2828

2929
// ---------------- AXI4-Slave: Write Address ----------------
3030
input wire [AXI_ID_WIDTH-1:0] s_axi_awid,
3131
input wire [AXI_ADDR_WIDTH-1:0] s_axi_awaddr,
32-
input wire [7:0] s_axi_awlen, // beats-1
32+
input wire [7:0] s_axi_awlen, // beats-1 (must be 0)
3333
input wire [2:0] s_axi_awsize, // must be 3'b010
3434
input wire [1:0] s_axi_awburst, // INCR only
3535
input wire s_axi_awvalid,
36-
output reg s_axi_awready,
36+
output logic s_axi_awready,
3737

3838
// ---------------- AXI4-Slave: Write Data -------------------
3939
input wire [AXI_DATA_WIDTH-1:0] s_axi_wdata,
4040
input wire [AXI_STRB_WIDTH-1:0] s_axi_wstrb,
4141
input wire s_axi_wlast,
4242
input wire s_axi_wvalid,
43-
output reg s_axi_wready,
43+
output logic s_axi_wready,
4444

4545
// ---------------- AXI4-Slave: Write Response ---------------
46-
output reg [AXI_ID_WIDTH-1:0] s_axi_bid,
47-
output reg [1:0] s_axi_bresp, // OKAY=2'b00, SLVERR=2'b10
48-
output reg s_axi_bvalid,
46+
output logic [AXI_ID_WIDTH-1:0] s_axi_bid,
47+
output logic [1:0] s_axi_bresp, // OKAY=2'b00, SLVERR=2'b10
48+
output logic s_axi_bvalid,
4949
input wire s_axi_bready,
5050

5151
// ---------------- Ibex LSU host port -----------------------
52-
output reg data_req_o,
53-
output reg [31:0] data_addr_o, // byte address, word-aligned
54-
output reg data_we_o,
55-
output reg [3:0] data_be_o,
56-
output reg [31:0] data_wdata_o,
52+
output logic data_req_o,
53+
output logic [31:0] data_addr_o, // byte address (unaligned allowed)
54+
output logic data_we_o,
55+
output logic [3:0] data_be_o,
56+
output logic [31:0] data_wdata_o,
5757
input wire data_gnt_i,
5858
input wire data_rvalid_i,
5959
input wire data_err_i,
@@ -75,34 +75,34 @@ module saxi_to_host #(
7575
eng_e eng_state, eng_state_n;
7676

7777
// Read command regs
78-
reg rd_cmd_valid;
79-
reg [AXI_ID_WIDTH-1:0] rd_id;
80-
reg [31:0] rd_addr; // word aligned (byte addr with [1:0]==0)
81-
reg [7:0] rd_len; // beats remaining (inclusive count)
82-
reg rd_busy; // burst accepted (address latched)
78+
logic rd_cmd_valid;
79+
logic [AXI_ID_WIDTH-1:0] rd_id;
80+
logic [31:0] rd_addr; // byte address (unaligned allowed)
81+
logic [7:0] rd_len; // beats remaining (inclusive count)
82+
logic rd_busy; // burst accepted (address latched)
8383

8484
// Write command regs
85-
reg wr_cmd_valid;
86-
reg [AXI_ID_WIDTH-1:0] wr_id;
87-
reg [31:0] wr_addr;
88-
reg [7:0] wr_len;
89-
reg wr_busy;
85+
logic wr_cmd_valid;
86+
logic [AXI_ID_WIDTH-1:0] wr_id;
87+
logic [31:0] wr_addr; // byte address (unaligned allowed)
88+
logic [7:0] wr_len;
89+
logic wr_busy;
9090

9191
// Write data buffer for current beat
92-
reg [31:0] wr_data_q;
93-
reg [3:0] wr_strb_q;
94-
reg wr_data_valid;
92+
logic [31:0] wr_data_q;
93+
logic [3:0] wr_strb_q;
94+
logic wr_data_valid;
9595

9696
// Engine bookkeeping
97-
reg cur_is_write;
98-
reg have_grant;
99-
reg error_seen;
97+
logic cur_is_write;
98+
logic have_grant;
99+
logic error_seen;
100100

101101
// R hold buffer (to obey RDATA stability while RVALID && !RREADY)
102-
reg r_hold_valid;
103-
reg [31:0] r_hold_data;
104-
reg [1:0] r_hold_resp;
105-
reg r_hold_last;
102+
logic r_hold_valid;
103+
logic [31:0] r_hold_data;
104+
logic [1:0] r_hold_resp;
105+
logic r_hold_last;
106106

107107
// Next-beat address increment (32-bit, INCR)
108108
function automatic [31:0] next_addr(input [31:0] a);
@@ -114,34 +114,34 @@ module saxi_to_host #(
114114
wire r_resp_pending = s_axi_rvalid | r_hold_valid;
115115
wire b_resp_pending = s_axi_bvalid;
116116

117+
// NOTE: alignment no longer checked here. Unaligned accesses are passed through.
117118
wire ar_ok = s_axi_arvalid &&
118119
(s_axi_arsize == 3'b010) &&
119120
(s_axi_arburst == AXI_BURST_INCR) &&
120-
(s_axi_araddr[1:0] == 2'b00) &&
121121
!rd_busy && !wr_busy &&
122122
(eng_state == IDLE) &&
123-
!r_resp_pending; // avoid back-to-back piling when master is stalled
123+
!r_resp_pending;
124124

125125
wire aw_ok = s_axi_awvalid &&
126126
(s_axi_awsize == 3'b010) &&
127127
(s_axi_awburst == AXI_BURST_INCR) &&
128-
(s_axi_awaddr[1:0] == 2'b00) &&
129128
!rd_busy && !wr_busy &&
130129
(eng_state == IDLE) &&
131-
!b_resp_pending; // keep one write burst outstanding wrt. B resp
130+
!b_resp_pending;
132131

133-
always @(*) begin
132+
always_comb begin
134133
s_axi_arready = ar_ok;
135134
s_axi_awready = aw_ok;
136135
end
137136

138137
// Latch read/write command when accepted
139-
always @(posedge clk or negedge rst_n) begin
138+
always_ff @(posedge clk or negedge rst_n) begin
140139
if (!rst_n) begin
141140
rd_cmd_valid <= 1'b0;
142141
rd_busy <= 1'b0;
143142
wr_cmd_valid <= 1'b0;
144143
wr_busy <= 1'b0;
144+
145145
rd_id <= '0;
146146
wr_id <= '0;
147147
rd_addr <= '0;
@@ -169,11 +169,11 @@ module saxi_to_host #(
169169
// ---------------- Write Data Channel Handling ----------------
170170
wire want_wbeat = (eng_state==W_ACTIVE) && !wr_data_valid;
171171

172-
always @(*) begin
172+
always_comb begin
173173
s_axi_wready = want_wbeat;
174174
end
175175

176-
always @(posedge clk or negedge rst_n) begin
176+
always_ff @(posedge clk or negedge rst_n) begin
177177
if (!rst_n) begin
178178
wr_data_q <= '0;
179179
wr_strb_q <= '0;
@@ -248,17 +248,17 @@ module saxi_to_host #(
248248
wire pick_read = rd_cmd_valid && !wr_cmd_valid;
249249

250250
// issue fields
251-
reg [31:0] issue_addr;
252-
reg [3:0] issue_be;
253-
reg [31:0] issue_wdata;
251+
logic [31:0] issue_addr;
252+
logic [3:0] issue_be;
253+
logic [31:0] issue_wdata;
254254

255255
// track grant & error accumulation
256-
always @(posedge clk or negedge rst_n) begin
256+
always_ff @(posedge clk or negedge rst_n) begin
257257
if (!rst_n) begin
258-
eng_state <= IDLE;
259-
cur_is_write<= 1'b0;
260-
have_grant <= 1'b0;
261-
error_seen <= 1'b0;
258+
eng_state <= IDLE;
259+
cur_is_write <= 1'b0;
260+
have_grant <= 1'b0;
261+
error_seen <= 1'b0;
262262
end else begin
263263
eng_state <= eng_state_n;
264264

@@ -278,7 +278,7 @@ module saxi_to_host #(
278278
end
279279

280280
// Beat counters & address update
281-
always @(posedge clk or negedge rst_n) begin
281+
always_ff @(posedge clk or negedge rst_n) begin
282282
if (!rst_n) begin
283283
// no-op
284284
end else begin
@@ -315,7 +315,7 @@ module saxi_to_host #(
315315
end
316316

317317
// Compute current issue fields
318-
always @(*) begin
318+
always_comb begin
319319
if (eng_state==W_ACTIVE || (eng_state==ISSUE && cur_is_write)) begin
320320
issue_addr = wr_addr;
321321
issue_be = wr_strb_q;
@@ -328,7 +328,7 @@ module saxi_to_host #(
328328
end
329329

330330
// FSM transitions & LSU driving
331-
always @(*) begin
331+
always_comb begin
332332
eng_state_n = eng_state;
333333
data_req_o = 1'b0;
334334
data_addr_o = 32'd0;
@@ -378,7 +378,7 @@ module saxi_to_host #(
378378
end
379379

380380
// Set cur_is_write when entering a burst
381-
always @(posedge clk or negedge rst_n) begin
381+
always_ff @(posedge clk or negedge rst_n) begin
382382
if (!rst_n) begin
383383
cur_is_write <= 1'b0;
384384
end else if (eng_state==IDLE) begin
@@ -389,26 +389,24 @@ module saxi_to_host #(
389389

390390
// ---------------- Optional protocol sanity checks (simulation-only) ----------------
391391
// synopsys translate_off
392-
always @(posedge clk) if (rst_n) begin
392+
always_ff @(posedge clk) if (rst_n) begin
393393
if (s_axi_arvalid && s_axi_arready) begin
394-
if (s_axi_arsize != 3'b010) $error("arsize != 3'b010");
395-
if (s_axi_arburst != AXI_BURST_INCR) $error("arburst != INCR");
396-
if (s_axi_araddr[1:0] != 2'b00) $error("araddr not word-aligned");
394+
if (s_axi_arsize != 3'b010) $error("saxi_to_host: arsize != 3'b010");
395+
if (s_axi_arburst != AXI_BURST_INCR) $error("saxi_to_host: arburst != INCR");
396+
if (s_axi_arlen != 8'd0) $error("saxi_to_host: only single-beat reads supported (arlen != 0)");
397+
// NOTE: unaligned araddr is allowed now
398+
// if (s_axi_araddr[1:0] != 2'b00) $warning("saxi_to_host: unaligned read address %h", s_axi_araddr);
397399
end
398400
if (s_axi_awvalid && s_axi_awready) begin
399-
if (s_axi_awsize != 3'b010) $error("awsize != 3'b010");
400-
if (s_axi_awburst != AXI_BURST_INCR) $error("awburst != INCR");
401-
if (s_axi_awaddr[1:0] != 2'b00) $error("awaddr not word-aligned");
402-
end
403-
// RDATA must be stable while RVALID && !RREADY
404-
if (s_axi_rvalid && !s_axi_rready) begin
405-
// (cannot easily assert stability here without a shadow; hold buffer enforces it)
406-
end
407-
// Optional: check WLAST on last write beat (informational)
408-
if (eng_state==WAIT_RSP && cur_is_write && data_rvalid_i && (wr_len==8'd1) && !s_axi_wlast) begin
409-
// Some masters may not drive WLAST correctly; warn if seen.
410-
// $warning("WLAST not observed on final write beat");
401+
if (s_axi_awsize != 3'b010) $error("saxi_to_host: awsize != 3'b010");
402+
if (s_axi_awburst != AXI_BURST_INCR) $error("saxi_to_host: awburst != INCR");
403+
if (s_axi_awlen != 8'd0) $error("saxi_to_host: only single-beat writes supported (awlen != 0)");
404+
// NOTE: unaligned awaddr is allowed now
405+
// if (s_axi_awaddr[1:0] != 2'b00) $warning("saxi_to_host: unaligned write address %h", s_axi_awaddr);
411406
end
407+
// Optional: check WLAST on write beat
408+
if (s_axi_wvalid && s_axi_wready && !s_axi_wlast)
409+
$warning("saxi_to_host: WLAST not observed on write beat (single-beat expected)");
412410
end
413411
// synopsys translate_on
414412

deepsocflow/test/sv/axi_int_reg_tb.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ module axi_int_reg_tb;
208208
initial begin
209209
$dumpfile("axi_int_reg_tb.vcd");
210210
$dumpvars();
211-
#10000us;
211+
#1000000us;
212212
$finish;
213213
end
214214

0 commit comments

Comments
 (0)