@@ -54,25 +54,33 @@ module bus #(
54
54
localparam int unsigned NumBitsHostSel = NrHosts > 1 ? $clog2 (NrHosts) : 1 ;
55
55
localparam int unsigned NumBitsDeviceSel = NrDevices > 1 ? $clog2 (NrDevices) : 1 ;
56
56
57
+ logic host_sel_valid;
58
+ logic device_sel_valid;
59
+ logic decode_err_resp;
60
+
57
61
logic [NumBitsHostSel- 1 : 0 ] host_sel_req, host_sel_resp;
58
62
logic [NumBitsDeviceSel- 1 : 0 ] device_sel_req, device_sel_resp;
59
63
60
64
// Master select prio arbiter
61
65
always_comb begin
66
+ host_sel_valid = 1'b0 ;
62
67
host_sel_req = '0 ;
63
68
for (integer host = NrHosts - 1 ; host >= 0 ; host = host - 1 ) begin
64
69
if (host_req_i[host]) begin
70
+ host_sel_valid = 1'b1 ;
65
71
host_sel_req = NumBitsHostSel ' (host);
66
72
end
67
73
end
68
74
end
69
75
70
76
// Device select
71
77
always_comb begin
78
+ device_sel_valid = 1'b0 ;
72
79
device_sel_req = '0 ;
73
80
for (integer device = 0 ; device < NrDevices; device = device + 1 ) begin
74
81
if ((host_addr_i[host_sel_req] & cfg_device_addr_mask[device])
75
82
== cfg_device_addr_base[device]) begin
83
+ device_sel_valid = 1'b1 ;
76
84
device_sel_req = NumBitsDeviceSel ' (device);
77
85
end
78
86
end
@@ -82,16 +90,19 @@ module bus #(
82
90
if (! rst_ni) begin
83
91
host_sel_resp <= '0 ;
84
92
device_sel_resp <= '0 ;
93
+ decode_err_resp <= 1'b0 ;
85
94
end else begin
86
95
// Responses are always expected 1 cycle after the request
87
96
device_sel_resp <= device_sel_req;
88
97
host_sel_resp <= host_sel_req;
98
+ // Decode failed; no device matched?
99
+ decode_err_resp <= host_sel_valid & ! device_sel_valid;
89
100
end
90
101
end
91
102
92
103
always_comb begin
93
104
for (integer device = 0 ; device < NrDevices; device = device + 1 ) begin
94
- if (NumBitsDeviceSel ' (device) == device_sel_req) begin
105
+ if (device_sel_valid && NumBitsDeviceSel ' (device) == device_sel_req) begin
95
106
device_req_o[device] = host_req_i[host_sel_req];
96
107
device_we_o[device] = host_we_i[host_sel_req];
97
108
device_addr_o[device] = host_addr_i[host_sel_req];
@@ -111,8 +122,8 @@ module bus #(
111
122
for (integer host = 0 ; host < NrHosts; host = host + 1 ) begin
112
123
host_gnt_o[host] = 1'b0 ;
113
124
if (NumBitsHostSel ' (host) == host_sel_resp) begin
114
- host_rvalid_o[host] = device_rvalid_i[device_sel_resp];
115
- host_err_o[host] = device_err_i[device_sel_resp];
125
+ host_rvalid_o[host] = device_rvalid_i[device_sel_resp] | decode_err_resp ;
126
+ host_err_o[host] = device_err_i[device_sel_resp] | decode_err_resp ;
116
127
host_rdata_o[host] = device_rdata_i[device_sel_resp];
117
128
end else begin
118
129
host_rvalid_o[host] = 1'b0 ;
0 commit comments