@@ -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
0 commit comments