Get xbar_sram from @kelvin_hw - The source-of-truth for xbar_sram is the Crossbar module in @kelvin_hw. Pull the verilog from the external repository, and update the name we reference by from xbar_sram->Crossbar. Change-Id: I1ef6794487ac9720f92ce3533d285bb0ffc03c56
diff --git a/doc/getting_started/setup_dv.md b/doc/getting_started/setup_dv.md index f58f008..aa5a209 100644 --- a/doc/getting_started/setup_dv.md +++ b/doc/getting_started/setup_dv.md
@@ -88,14 +88,3 @@ $assertoff(0, tb.dut); end ``` - -2. Add the following lines: - ``` - `define STOP_COND 0 - `define PRINTF_COND 0 - ``` - at the top of the files: - ``` - hw/top_matcha/ip/ml_top/rtl/xbar_sram.v - ``` - to turn off the $fatal statements and the unwanted debug messages
diff --git a/hw/top_matcha/ip/ml_top/ml_top.core b/hw/top_matcha/ip/ml_top/ml_top.core index 127344a..21c614e 100644 --- a/hw/top_matcha/ip/ml_top/ml_top.core +++ b/hw/top_matcha/ip/ml_top/ml_top.core
@@ -11,6 +11,7 @@ - lowrisc:ip:tlul - lowrisc:prim:mubi - google:ip:kelvin + - google:ip:crossbar files: - rtl/ml_pkg.sv @@ -18,7 +19,6 @@ - rtl/ml_top_core_reg_top.sv - rtl/ml_dmem.sv - rtl/ml_top.sv - - rtl/xbar_sram.v file_type: systemVerilogSource files_verilator_waiver:
diff --git a/hw/top_matcha/ip/ml_top/rtl/ml_dmem.sv b/hw/top_matcha/ip/ml_top/rtl/ml_dmem.sv index 211bdb9..2a294ec 100644 --- a/hw/top_matcha/ip/ml_top/rtl/ml_dmem.sv +++ b/hw/top_matcha/ip/ml_top/rtl/ml_dmem.sv
@@ -16,7 +16,7 @@ // This module implements the D-Mem inside the Vector Core Top Level // -// This memory can be accessed either by TLUL or ML cores through xbar_sram +// This memory can be accessed either by TLUL or ML cores through Crossbar module ml_dmem import ml_pkg::*; @@ -97,7 +97,7 @@ assign ram_cfg.ram_cfg = { 3'b0, volt_sel_i, 1'b0 }; assign ram_cfg.rf_cfg = 5'b0; - // xbar_sram only support Byte-Mask for now. i.e 8 data bits per mask bit. + // Crossbar only support Byte-Mask for now. i.e 8 data bits per mask bit. assign xbar_wmask_b = {xbar_wmask[248], xbar_wmask[240], xbar_wmask[232], xbar_wmask[224], xbar_wmask[216], xbar_wmask[208], xbar_wmask[200], xbar_wmask[192], xbar_wmask[184], xbar_wmask[176], xbar_wmask[168], xbar_wmask[160], @@ -168,7 +168,7 @@ // crossbar - xbar_sram u_xbar_sram( + Crossbar u_crossbar( .clock (clk_i), .reset (~rst_ni), // In Port 0 -- TLUL-SRAM Adatper
diff --git a/hw/top_matcha/ip/ml_top/rtl/ml_top.sv b/hw/top_matcha/ip/ml_top/rtl/ml_top.sv index 4d98fec..b70bc3f 100644 --- a/hw/top_matcha/ip/ml_top/rtl/ml_top.sv +++ b/hw/top_matcha/ip/ml_top/rtl/ml_top.sv
@@ -158,7 +158,7 @@ ); - // Memory Block (inlcude xbar_sram and SRAM banks) + // Memory Block (inlcude Crossbar and SRAM banks) ml_dmem u_ml_dmem ( .rst_ni ( rst_ni ), .clk_i ( clk_i ),
diff --git a/hw/top_matcha/ip/ml_top/rtl/xbar_sram.v b/hw/top_matcha/ip/ml_top/rtl/xbar_sram.v deleted file mode 100644 index a39b220..0000000 --- a/hw/top_matcha/ip/ml_top/rtl/xbar_sram.v +++ /dev/null
@@ -1,405 +0,0 @@ -// Copyright 2023 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//---------------------------------------------- -// Description: SRAM Crossbar -// Files: xbar_sram.v -// --4 way -// --Address Width =22 -// --Data Width =256 -// --ID Width = 8 -// --Maintain selection if no activitiy - -`define STOP_COND 0 -`define PRINTF_COND 0 - -// SHA: b07e5a3168f36e80ae0186116e2bc9abef6595c3 -module xbar_sram( - input clock, - input reset, - input io_in_0_cvalid, - output io_in_0_cready, - input io_in_0_cwrite, - input [21:0] io_in_0_caddr, - input [7:0] io_in_0_cid, - input [255:0] io_in_0_wdata, - input [31:0] io_in_0_wmask, - output io_in_0_rvalid, - output [7:0] io_in_0_rid, - output [255:0] io_in_0_rdata, - input io_in_1_cvalid, - output io_in_1_cready, - input io_in_1_cwrite, - input [21:0] io_in_1_caddr, - input [7:0] io_in_1_cid, - input [255:0] io_in_1_wdata, - input [31:0] io_in_1_wmask, - output io_in_1_rvalid, - output [7:0] io_in_1_rid, - output [255:0] io_in_1_rdata, - input io_in_2_cvalid, - output io_in_2_cready, - input io_in_2_cwrite, - input [21:0] io_in_2_caddr, - input [7:0] io_in_2_cid, - input [255:0] io_in_2_wdata, - input [31:0] io_in_2_wmask, - output io_in_2_rvalid, - output [7:0] io_in_2_rid, - output [255:0] io_in_2_rdata, - input io_in_3_cvalid, - output io_in_3_cready, - input io_in_3_cwrite, - input [21:0] io_in_3_caddr, - input [7:0] io_in_3_cid, - input [255:0] io_in_3_wdata, - input [31:0] io_in_3_wmask, - output io_in_3_rvalid, - output [7:0] io_in_3_rid, - output [255:0] io_in_3_rdata, - output io_out_valid, - output io_out_write, - output [21:0] io_out_addr, - output [255:0] io_out_wdata, - output [31:0] io_out_wmask, - input [255:0] io_out_rdata -); -`ifdef RANDOMIZE_REG_INIT - reg [31:0] _RAND_0; - reg [31:0] _RAND_1; - reg [31:0] _RAND_2; - reg [31:0] _RAND_3; - reg [31:0] _RAND_4; - reg [255:0] _RAND_5; - reg [31:0] _RAND_6; - reg [31:0] _RAND_7; - reg [31:0] _RAND_8; - reg [31:0] _RAND_9; - reg [31:0] _RAND_10; - reg [31:0] _RAND_11; - reg [31:0] _RAND_12; - reg [31:0] _RAND_13; - reg [255:0] _RAND_14; -`endif // RANDOMIZE_REG_INIT - reg [3:0] csel0; // @[Crossbar.scala 61:24] - wire [1:0] _T_5 = csel0[0] + csel0[1]; // @[Bitwise.scala 48:55] - wire [1:0] _T_7 = csel0[2] + csel0[3]; // @[Bitwise.scala 48:55] - wire [2:0] _T_9 = _T_5 + _T_7; // @[Bitwise.scala 48:55] - wire _T_13 = ~reset; // @[Crossbar.scala 62:11] - wire [3:0] _T_15 = {io_in_3_cvalid,io_in_2_cvalid,io_in_1_cvalid,io_in_0_cvalid}; // @[Crossbar.scala 88:18] - wire _csel0_T = io_in_0_cvalid | io_in_1_cvalid; // @[Crossbar.scala 74:18] - wire _csel0_T_2 = io_in_1_cvalid & ~io_in_0_cvalid; // @[Crossbar.scala 75:31] - wire _csel0_T_5 = io_in_0_cvalid | io_in_1_cvalid | io_in_2_cvalid; // @[Crossbar.scala 74:18] - wire _csel0_T_7 = io_in_2_cvalid & ~_csel0_T; // @[Crossbar.scala 75:31] - wire _csel0_T_12 = io_in_3_cvalid & ~_csel0_T_5; // @[Crossbar.scala 75:31] - wire [3:0] _csel0_T_14 = {_csel0_T_12,_csel0_T_7,_csel0_T_2,io_in_0_cvalid}; // @[Cat.scala 31:58] - wire cen0 = io_in_0_cvalid & csel0[0] | io_in_1_cvalid & csel0[1] | io_in_2_cvalid & csel0[2] | io_in_3_cvalid & - csel0[3]; // @[Crossbar.scala 102:18] - reg cvalid1; // @[Crossbar.scala 113:26] - reg cwrite1; // @[Crossbar.scala 114:26] - reg [16:0] cindex1; // @[Crossbar.scala 115:22] - reg [9:0] cid1; // @[Crossbar.scala 116:22] - reg [255:0] wdata1; // @[Crossbar.scala 117:22] - reg [31:0] wmask1; // @[Crossbar.scala 118:22] - wire [16:0] _T_22 = csel0[0] ? io_in_0_caddr[21:5] : 17'h0; // @[Crossbar.scala 128:24] - wire [8:0] _T_25 = {1'h0,io_in_0_cid}; // @[Cat.scala 31:58] - wire [8:0] _T_26 = csel0[0] ? _T_25 : 9'h0; // @[Crossbar.scala 129:24] - wire [9:0] _T_27 = {{1'd0}, _T_26}; // @[Crossbar.scala 129:19] - wire [255:0] _T_29 = csel0[0] ? io_in_0_wdata : 256'h0; // @[Crossbar.scala 130:24] - wire [31:0] _T_32 = csel0[0] ? io_in_0_wmask : 32'h0; // @[Crossbar.scala 131:24] - wire [16:0] _T_39 = csel0[1] ? io_in_1_caddr[21:5] : 17'h0; // @[Crossbar.scala 128:24] - wire [16:0] _T_40 = _T_22 | _T_39; // @[Crossbar.scala 128:19] - wire [8:0] _T_42 = {1'h1,io_in_1_cid}; // @[Cat.scala 31:58] - wire [8:0] _T_43 = csel0[1] ? _T_42 : 9'h0; // @[Crossbar.scala 129:24] - wire [9:0] _GEN_10 = {{1'd0}, _T_43}; // @[Crossbar.scala 129:19] - wire [9:0] _T_44 = _T_27 | _GEN_10; // @[Crossbar.scala 129:19] - wire [255:0] _T_46 = csel0[1] ? io_in_1_wdata : 256'h0; // @[Crossbar.scala 130:24] - wire [255:0] _T_47 = _T_29 | _T_46; // @[Crossbar.scala 130:19] - wire [31:0] _T_49 = csel0[1] ? io_in_1_wmask : 32'h0; // @[Crossbar.scala 131:24] - wire [31:0] _T_50 = _T_32 | _T_49; // @[Crossbar.scala 131:19] - wire [16:0] _T_56 = csel0[2] ? io_in_2_caddr[21:5] : 17'h0; // @[Crossbar.scala 128:24] - wire [16:0] _T_57 = _T_40 | _T_56; // @[Crossbar.scala 128:19] - wire [9:0] _T_59 = {2'h2,io_in_2_cid}; // @[Cat.scala 31:58] - wire [9:0] _T_60 = csel0[2] ? _T_59 : 10'h0; // @[Crossbar.scala 129:24] - wire [9:0] _T_61 = _T_44 | _T_60; // @[Crossbar.scala 129:19] - wire [255:0] _T_63 = csel0[2] ? io_in_2_wdata : 256'h0; // @[Crossbar.scala 130:24] - wire [255:0] _T_64 = _T_47 | _T_63; // @[Crossbar.scala 130:19] - wire [31:0] _T_66 = csel0[2] ? io_in_2_wmask : 32'h0; // @[Crossbar.scala 131:24] - wire [31:0] _T_67 = _T_50 | _T_66; // @[Crossbar.scala 131:19] - wire cwriteNxt = csel0[0] & io_in_0_cwrite | csel0[1] & io_in_1_cwrite | csel0[2] & io_in_2_cwrite | csel0[3] & - io_in_3_cwrite; // @[Crossbar.scala 127:18] - wire [16:0] _T_72 = csel0[3] ? io_in_3_caddr[21:5] : 17'h0; // @[Crossbar.scala 128:24] - wire [16:0] cindexNxt = _T_57 | _T_72; // @[Crossbar.scala 128:19] - wire [9:0] _T_74 = {2'h3,io_in_3_cid}; // @[Cat.scala 31:58] - wire [9:0] _T_75 = csel0[3] ? _T_74 : 10'h0; // @[Crossbar.scala 129:24] - wire [9:0] cidNxt = _T_61 | _T_75; // @[Crossbar.scala 129:19] - wire [255:0] _T_77 = csel0[3] ? io_in_3_wdata : 256'h0; // @[Crossbar.scala 130:24] - wire [255:0] wdataNxt = _T_64 | _T_77; // @[Crossbar.scala 130:19] - wire [31:0] _T_79 = csel0[3] ? io_in_3_wmask : 32'h0; // @[Crossbar.scala 131:24] - wire [31:0] wmaskNxt = _T_67 | _T_79; // @[Crossbar.scala 131:19] - reg rvalid2; // @[Crossbar.scala 161:26] - reg [9:0] rid2; // @[Crossbar.scala 162:22] - reg rvalid3_0; // @[Crossbar.scala 169:26] - reg rvalid3_1; // @[Crossbar.scala 169:26] - reg rvalid3_2; // @[Crossbar.scala 169:26] - reg rvalid3_3; // @[Crossbar.scala 169:26] - reg [7:0] rid3; // @[Crossbar.scala 170:22] - reg [255:0] rdata3; // @[Crossbar.scala 171:22] - assign io_in_0_cready = csel0[0]; // @[Crossbar.scala 93:31] - assign io_in_0_rvalid = rvalid3_0; // @[Crossbar.scala 187:23] - assign io_in_0_rid = rvalid3_0 ? rid3 : 8'h0; // @[Crossbar.scala 189:29] - assign io_in_0_rdata = rvalid3_0 ? rdata3 : 256'h0; // @[Crossbar.scala 188:29] - assign io_in_1_cready = csel0[1]; // @[Crossbar.scala 93:31] - assign io_in_1_rvalid = rvalid3_1; // @[Crossbar.scala 187:23] - assign io_in_1_rid = rvalid3_1 ? rid3 : 8'h0; // @[Crossbar.scala 189:29] - assign io_in_1_rdata = rvalid3_1 ? rdata3 : 256'h0; // @[Crossbar.scala 188:29] - assign io_in_2_cready = csel0[2]; // @[Crossbar.scala 93:31] - assign io_in_2_rvalid = rvalid3_2; // @[Crossbar.scala 187:23] - assign io_in_2_rid = rvalid3_2 ? rid3 : 8'h0; // @[Crossbar.scala 189:29] - assign io_in_2_rdata = rvalid3_2 ? rdata3 : 256'h0; // @[Crossbar.scala 188:29] - assign io_in_3_cready = csel0[3]; // @[Crossbar.scala 93:31] - assign io_in_3_rvalid = rvalid3_3; // @[Crossbar.scala 187:23] - assign io_in_3_rid = rvalid3_3 ? rid3 : 8'h0; // @[Crossbar.scala 189:29] - assign io_in_3_rdata = rvalid3_3 ? rdata3 : 256'h0; // @[Crossbar.scala 188:29] - assign io_out_valid = cvalid1; // @[Crossbar.scala 151:18] - assign io_out_write = cwrite1; // @[Crossbar.scala 152:18] - assign io_out_addr = {cindex1,5'h0}; // @[Cat.scala 31:58] - assign io_out_wdata = wdata1; // @[Crossbar.scala 154:18] - assign io_out_wmask = wmask1; // @[Crossbar.scala 155:18] - always @(posedge clock) begin - if (cen0) begin // @[Crossbar.scala 140:17] - cindex1 <= cindexNxt; // @[Crossbar.scala 143:15] - end - if (cen0) begin // @[Crossbar.scala 140:17] - cid1 <= cidNxt; // @[Crossbar.scala 144:15] - end - if (cen0) begin // @[Crossbar.scala 140:17] - if (cwriteNxt) begin // @[Crossbar.scala 145:24] - wdata1 <= wdataNxt; // @[Crossbar.scala 146:17] - end - end - if (cen0) begin // @[Crossbar.scala 140:17] - if (cwriteNxt) begin // @[Crossbar.scala 145:24] - wmask1 <= wmaskNxt; // @[Crossbar.scala 147:17] - end - end - rid2 <= cid1; // @[Crossbar.scala 165:13] - if (rvalid2) begin // @[Crossbar.scala 181:20] - rid3 <= rid2[7:0]; // @[Crossbar.scala 183:14] - end - if (rvalid2) begin // @[Crossbar.scala 181:20] - rdata3 <= io_out_rdata; // @[Crossbar.scala 182:14] - end - `ifndef SYNTHESIS - `ifdef STOP_COND - if (`STOP_COND) begin - `endif - if (~reset & ~(_T_9 == 3'h1)) begin - $fatal; // @[Crossbar.scala 62:11] - end - `ifdef STOP_COND - end - `endif - `endif // SYNTHESIS - `ifndef SYNTHESIS - `ifdef PRINTF_COND - if (`PRINTF_COND) begin - `endif - if (~reset & ~(_T_9 == 3'h1)) begin - $fwrite(32'h80000002,"Assertion failed\n at Crossbar.scala:62 assert(PopCount(csel0) === 1.U)\n"); // @[Crossbar.scala 62:11] - end - `ifdef PRINTF_COND - end - `endif - `endif // SYNTHESIS - `ifndef SYNTHESIS - `ifdef STOP_COND - if (`STOP_COND) begin - `endif - if (_T_13 & ~(~(io_out_valid & io_out_addr[4:0] != 5'h0))) begin - $fatal; // @[Crossbar.scala 157:11] - end - `ifdef STOP_COND - end - `endif - `endif // SYNTHESIS - `ifndef SYNTHESIS - `ifdef PRINTF_COND - if (`PRINTF_COND) begin - `endif - if (_T_13 & ~(~(io_out_valid & io_out_addr[4:0] != 5'h0))) begin - $fwrite(32'h80000002, - "Assertion failed\n at Crossbar.scala:157 assert(!(io.out.valid && io.out.addr(alsb - 1, 0) =/= 0.U))\n" - ); // @[Crossbar.scala 157:11] - end - `ifdef PRINTF_COND - end - `endif - `endif // SYNTHESIS - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 88:34] - csel0 <= 4'h1; // @[Crossbar.scala 89:13] - end else if (_T_15 != 4'h0) begin // @[Crossbar.scala 61:24] - csel0 <= _csel0_T_14; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 102:18] - cvalid1 <= 1'h0; - end else begin - cvalid1 <= io_in_0_cvalid & csel0[0] | io_in_1_cvalid & csel0[1] | io_in_2_cvalid & csel0[2] | io_in_3_cvalid & - csel0[3]; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 140:17] - cwrite1 <= 1'h0; // @[Crossbar.scala 142:15] - end else if (cen0) begin // @[Crossbar.scala 114:26] - cwrite1 <= cwriteNxt; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 164:24] - rvalid2 <= 1'h0; - end else begin - rvalid2 <= cvalid1 & ~cwrite1; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 175:31] - rvalid3_0 <= 1'h0; - end else begin - rvalid3_0 <= rvalid2 & rid2[9:8] == 2'h0; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 175:31] - rvalid3_1 <= 1'h0; - end else begin - rvalid3_1 <= rvalid2 & rid2[9:8] == 2'h1; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 175:31] - rvalid3_2 <= 1'h0; - end else begin - rvalid3_2 <= rvalid2 & rid2[9:8] == 2'h2; - end - end - always @(posedge clock or posedge reset) begin - if (reset) begin // @[Crossbar.scala 175:31] - rvalid3_3 <= 1'h0; - end else begin - rvalid3_3 <= rvalid2 & rid2[9:8] == 2'h3; - end - end -// Register and memory initialization -`ifdef RANDOMIZE_GARBAGE_ASSIGN -`define RANDOMIZE -`endif -`ifdef RANDOMIZE_INVALID_ASSIGN -`define RANDOMIZE -`endif -`ifdef RANDOMIZE_REG_INIT -`define RANDOMIZE -`endif -`ifdef RANDOMIZE_MEM_INIT -`define RANDOMIZE -`endif -`ifndef RANDOM -`define RANDOM $random -`endif -`ifdef RANDOMIZE_MEM_INIT - integer initvar; -`endif -`ifndef SYNTHESIS -`ifdef FIRRTL_BEFORE_INITIAL -`FIRRTL_BEFORE_INITIAL -`endif -initial begin - `ifdef RANDOMIZE - `ifdef INIT_RANDOM - `INIT_RANDOM - `endif - `ifndef VERILATOR - `ifdef RANDOMIZE_DELAY - #`RANDOMIZE_DELAY begin end - `else - #0.002 begin end - `endif - `endif -`ifdef RANDOMIZE_REG_INIT - _RAND_0 = {1{`RANDOM}}; - csel0 = _RAND_0[3:0]; - _RAND_1 = {1{`RANDOM}}; - cvalid1 = _RAND_1[0:0]; - _RAND_2 = {1{`RANDOM}}; - cwrite1 = _RAND_2[0:0]; - _RAND_3 = {1{`RANDOM}}; - cindex1 = _RAND_3[16:0]; - _RAND_4 = {1{`RANDOM}}; - cid1 = _RAND_4[9:0]; - _RAND_5 = {8{`RANDOM}}; - wdata1 = _RAND_5[255:0]; - _RAND_6 = {1{`RANDOM}}; - wmask1 = _RAND_6[31:0]; - _RAND_7 = {1{`RANDOM}}; - rvalid2 = _RAND_7[0:0]; - _RAND_8 = {1{`RANDOM}}; - rid2 = _RAND_8[9:0]; - _RAND_9 = {1{`RANDOM}}; - rvalid3_0 = _RAND_9[0:0]; - _RAND_10 = {1{`RANDOM}}; - rvalid3_1 = _RAND_10[0:0]; - _RAND_11 = {1{`RANDOM}}; - rvalid3_2 = _RAND_11[0:0]; - _RAND_12 = {1{`RANDOM}}; - rvalid3_3 = _RAND_12[0:0]; - _RAND_13 = {1{`RANDOM}}; - rid3 = _RAND_13[7:0]; - _RAND_14 = {8{`RANDOM}}; - rdata3 = _RAND_14[255:0]; -`endif // RANDOMIZE_REG_INIT - if (reset) begin - csel0 = 4'h1; - end - if (reset) begin - cvalid1 = 1'h0; - end - if (reset) begin - cwrite1 = 1'h0; - end - if (reset) begin - rvalid2 = 1'h0; - end - if (reset) begin - rvalid3_0 = 1'h0; - end - if (reset) begin - rvalid3_1 = 1'h0; - end - if (reset) begin - rvalid3_2 = 1'h0; - end - if (reset) begin - rvalid3_3 = 1'h0; - end - `endif // RANDOMIZE -end // initial -`ifdef FIRRTL_AFTER_INITIAL -`FIRRTL_AFTER_INITIAL -`endif -`endif // SYNTHESIS -endmodule