We are getting out of range warnings/errors from y...
# openlane
s
We are getting out of range warnings/errors from yosys even though they are in range, can you help us about this? `/Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v357 Warning: Identifier
\vectors.register_0' is implicitly declared.
/Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v357 Warning: Range select [15:0] out of bounds on signal `\vectors.register_0': Setting all 16 result bits to undef. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v358 Warning: Identifier `\vectors.register_1' is implicitly declared. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v358 Warning: Range select [15:0] out of bounds on signal `\vectors.register_1': Setting all 16 result bits to undef. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v359 Warning: Identifier `\vectors.register_2' is implicitly declared. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v359 Warning: Range select [15:0] out of bounds on signal `\vectors.register_2': Setting all 16 result bits to undef. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v360 Warning: Identifier `\vectors.register_3' is implicitly declared. /Users/selimsandal/Developer/OneShotNPU/openlane/user_proj_npu/../../verilog/rtl/npu_v.v360 Warning: Range select [15:0] out of bounds on signal `\vectors.register_3': Setting all 16 result bits to undef.
m
Are
\vectors.register_0
etc. explicitly declared as bus wires? Can you share
verilog/rtl/npu_v.v
?
s
@Mitch Bailey they are declared like this logic [255:0] register_0; logic [255:0] register_1; logic [255:0] register_2; logic [255:0] register_3;
module vector_regs #( parameter WIDTH = 16, parameter NUM_VECTORS = 4, parameter VECTOR_SIZE = 16 ) ( input logic clk, input rst, input [1:0] read_addr, output logic [WIDTH*VECTOR_SIZE-1:0] read_data, //partial read input we, //write enable, input [5:0] write_addr, // [5:4] selects register, [3:0] selects element input [WIDTH-1:0] write_data, //partial write input full_we, //full write enable input [255:0] full_write_data ); logic [255:0] register_0; logic [255:0] register_1; logic [255:0] register_2; logic [255:0] register_3; always_ff @(posedge clk) begin if (we) begin case (write_addr[5:4]) 2'b00: register_0[write_addr[3:0]*WIDTH +: WIDTH] <= write_data; 2'b01: register_1[write_addr[3:0]*WIDTH +: WIDTH] <= write_data; 2'b10: register_2[write_addr[3:0]*WIDTH +: WIDTH] <= write_data; 2'b11: register_3[write_addr[3:0]*WIDTH +: WIDTH] <= write_data; endcase end if (full_we) begin case (write_addr[5:4]) 2'b00: register_0 <= full_write_data; 2'b01: register_1 <= full_write_data; 2'b10: register_2 <= full_write_data; 2'b11: register_3 <= full_write_data; endcase end end always_comb begin case (read_addr) 2'b00: read_data = register_0; 2'b01: read_data = register_1; 2'b10: read_data = register_2; 2'b11: read_data = register_3; default: read_data = 256'b0; endcase end endmodule here is the full module
m
So when
write_addr[3:0]
=
4'b0000
, you want write to
register_0[0 +: 16]
? Doesn’t this translate to
register_0[0:-15]
? Maybe you want to use
register_0[(write_addr[3+0]+1)*WIDTH-1 +: WIDTH]
. This should be
register_0[15:0]
. However, I’m not an authority on verilog bus slicing.
s
There are no negative numbered errors in the log file
all assignments are valid but the flow is still stopping