Qualify spread & collect in mem_mesh for yosys
diff --git a/verilog/rtl/mem_mesh.v b/verilog/rtl/mem_mesh.v index 5e18600..c9ee4a5 100644 --- a/verilog/rtl/mem_mesh.v +++ b/verilog/rtl/mem_mesh.v
@@ -68,16 +68,16 @@ end end else begin:i_layernz for (group=0; group<GROUPS; group=group+1) begin:g_group - wire gs1 = spread[layer-1].gsel[group*2] & spread[layer-1].gspread[group*2][0]; - wire gs2 = spread[layer-1].gsel[group*2+1] & spread[layer-1].gspread[group*2+1][0]; - wire [`DATA_WIDTH-1:0] gd1 = spread[layer-1].gdata[group*2]; - wire [`DATA_WIDTH-1:0] gd2 = spread[layer-1].gdata[group*2+1]; + wire gs1 = g_cell[addr].spread[layer-1].gsel[group*2] & g_cell[addr].spread[layer-1].gspread[group*2][0]; + wire gs2 = g_cell[addr].spread[layer-1].gsel[group*2+1] & g_cell[addr].spread[layer-1].gspread[group*2+1][0]; + wire [`DATA_WIDTH-1:0] gd1 = g_cell[addr].spread[layer-1].gdata[group*2]; + wire [`DATA_WIDTH-1:0] gd2 = g_cell[addr].spread[layer-1].gdata[group*2+1]; assign gsel[group] = gs1 | gs2; assign gdata[group] = gs1 ? gd1 : gd2; for (spl=0; spl<=`LOG_CORES-layer; spl=spl+1) begin:g_spread - wire gsp1 = spread[layer-1].gspread[group*2][spl+1]; - wire gsp2 = spread[layer-1].gspread[group*2+1][spl+1]; - assign gspread[group][spl] = gs1 ? gsp1 : gsp2; + wire gsp1 = g_cell[addr].spread[layer-1].gspread[group*2][spl+1]; + wire gsp2 = g_cell[addr].spread[layer-1].gspread[group*2+1][spl+1]; + assign g_cell[addr].gspread[group][spl] = gs1 ? gsp1 : gsp2; end end end @@ -88,15 +88,15 @@ wire [`DATA_WIDTH-1:0] gd_i; if (`MEM_IO_FIRST <= addr && addr < `MEM_IO_LAST1) begin:i_io localparam io = addr - `MEM_IO_FIRST; - wire gs_o = spread[`LOG_CORES].gsel[0] & spread[`LOG_CORES].gspread[0][0]; - wire [`DATA_WIDTH-1:0] gd_o = {(`DATA_WIDTH){gs_o}} & spread[`LOG_CORES].gdata[0]; + wire gs_o = g_cell[addr].spread[`LOG_CORES].gsel[0] & g_cell[addr].spread[`LOG_CORES].gspread[0][0]; + wire [`DATA_WIDTH-1:0] gd_o = {(`DATA_WIDTH){gs_o}} & g_cell[addr].spread[`LOG_CORES].gdata[0]; assign io_active_out[io] = gs_o; assign io_data_out[io*`DATA_WIDTH +: `DATA_WIDTH] = gd_o; - assign gs_i = io_active_in[io] ? 1'b1 : spread[`LOG_CORES].gsel[0]; - assign gd_i = io_active_in[io] ? io_data_in[io*`DATA_WIDTH +: `DATA_WIDTH] : spread[`LOG_CORES].gdata[0]; + assign gs_i = io_active_in[io] ? 1'b1 : g_cell[addr].spread[`LOG_CORES].gsel[0]; + assign gd_i = io_active_in[io] ? io_data_in[io*`DATA_WIDTH +: `DATA_WIDTH] : g_cell[addr].spread[`LOG_CORES].gdata[0]; end else begin:i_nio - assign gs_i = spread[`LOG_CORES].gsel[0]; - assign gd_i = spread[`LOG_CORES].gdata[0]; + assign gs_i = g_cell[addr].spread[`LOG_CORES].gsel[0]; + assign gd_i = g_cell[addr].spread[`LOG_CORES].gdata[0]; end // calculate spreading back from groups of cores to individual cores @@ -108,23 +108,23 @@ assign pgsel[0] = gs_i; assign pgdata[0] = gd_i; for (group=1; group<GROUPS; group=group+1) begin:g_group - assign pgsel[group] = spread[layer].gsel[group]; - assign pgdata[group] = spread[layer].gdata[group]; + assign pgsel[group] = g_cell[addr].spread[layer].gsel[group]; + assign pgdata[group] = g_cell[addr].spread[layer].gdata[group]; end end else begin:i_layernl for (group=0; group<GROUPS; group=group+1) begin:g_group - wire gs = spread[layer].gsel[group]; - wire [`DATA_WIDTH-1:0] gd = spread[layer].gdata[group]; - wire cgs = collect[layer+1].pgsel[group/2]; - wire [`DATA_WIDTH-1:0] cgd = collect[layer+1].pgdata[group/2]; + wire gs = g_cell[addr].spread[layer].gsel[group]; + wire [`DATA_WIDTH-1:0] gd = g_cell[addr].spread[layer].gdata[group]; + wire cgs = g_cell[addr].collect[layer+1].pgsel[group/2]; + wire [`DATA_WIDTH-1:0] cgd = g_cell[addr].collect[layer+1].pgdata[group/2]; assign pgsel[group] = cgs | gs; assign pgdata[group] = cgs ? cgd : gd; end end end for (core=0; core<`CORES; core=core+1) begin:g_core_c - assign postsel[core][addr] = collect[0].pgsel[core]; - assign postdata[core][addr] = collect[0].pgdata[core]; + assign postsel[core][addr] = g_cell[addr].collect[0].pgsel[core]; + assign postdata[core][addr] = g_cell[addr].collect[0].pgdata[core]; end // sequential write logic