├── LICENSE ├── README.md ├── rtl ├── .gitkeep ├── ctrl_engine.v ├── dp_ram.v ├── dp_ram_regout.v ├── fe_buf.v ├── olp_buf.v ├── param_buf.v ├── pe_array │ ├── pe.v │ ├── pe2.v │ ├── pe_array.v │ └── pe_ic.v ├── pu │ ├── pu_adder2.v │ ├── pu_adder4.v │ ├── pu_bias_add_pipe1.v │ ├── pu_hbm_pipe.v │ ├── pu_ic_add_pipe0.v │ ├── pu_lbm_pipe.v │ ├── pu_mul.v │ ├── pu_relu_mul_pipe2.v │ ├── pu_requant_pipe4.v │ ├── pu_resi_add_pipe_p3.v │ └── pu_top.v ├── res_buf.v ├── sch │ ├── addr_if.v │ ├── handshake_sche2pe.v │ ├── sche_sub.v │ └── scheduler.v ├── top.v └── wt_buf.v └── sim ├── .gitkeep ├── flist └── filelist.f ├── tb ├── tb_addr_if.v ├── tb_ctrl_engine.sv ├── tb_ppp.sv ├── tb_scheduler.sv ├── tb_scheduler.v ├── tb_top.sv └── tb_top_switch.sv ├── tv ├── dndm │ ├── fe_buf.txt │ ├── layer1.txt │ ├── layer2.txt │ ├── layer3.txt │ ├── layer4.txt │ ├── layer4_resi.txt │ ├── layer5.txt │ ├── param_buf.txt │ └── wt_buf.txt ├── reg.txt └── sr │ ├── fe_buf.txt │ ├── layer1.txt │ ├── layer2.txt │ ├── layer3.txt │ ├── layer4.txt │ ├── layer5.txt │ ├── param_buf.txt │ └── wt_buf.txt └── work └── makefile /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OpenASIC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xkDLA 2 | XinKai Deep Learning Accelerator 3 | 4 | xkDLA 是面向AI-ISP的轻量化DLA数据流处理器,它由[复旦大学](http://fudan.edu.cn/)[专用集成电路与系统国家重点实验室](http://sme.fudan.edu.cn/)(State Key Lab of ASIC & System,Fudan University)[视频图像处理器实验室](http://viplab.fudan.edu.cn)(Video&Image Processor, VIP Lab)[范益波](https://sme.fudan.edu.cn/info/detail?id=132)教授研究团队开发完成,并开放源代码。任何组织个人可以无偿使用上述代码用于研究和生产目的,VIP Lab将会持续更新并维护xkDLA的开发。 5 | 6 | > ### 关于VIP Lab 7 | 8 | 复旦大学VIP实验室专注于从事下一代视频、图像硬件处器研究,包括超高清视频编码器(H.264/H.265 Video Encoder IP),图像去雾(Dehazing)处理器,双目视觉处理器(Stereo Matching),深度学习加速器(Deep Learning Accelerator)等。 9 | 实验室网站 http://viplab.fudan.edu.cn 10 | 11 | > ### 项目论坛 12 | 13 | http://www.openasic.org -------------------------------------------------------------------------------- /rtl/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openasic-org/xkDLA/bed44c45b0e9e4f0049bfef0bcc29a04522ca584/rtl/.gitkeep -------------------------------------------------------------------------------- /rtl/ctrl_engine.v: -------------------------------------------------------------------------------- 1 | /* 2 | Top Module: control.v 3 | Author: Hao Zhang 4 | Time: 202307 5 | */ 6 | 7 | module ctrl_engine #( 8 | parameter REG_IFMH_WIDTH = 10 , 9 | parameter REG_IFMW_WIDTH = 10 , 10 | parameter REG_TILEH_WIDTH = 6 , 11 | parameter REG_TNY_WIDTH = 6 , 12 | parameter REG_TNX_WIDTH = 6 , 13 | parameter REG_TLW_WIDTH = 6 , 14 | parameter REG_TLH_WIDTH = 6 , 15 | parameter TILE_BASE_W = 32 , 16 | parameter REG_IH_WIDTH = 6 , 17 | parameter REG_OH_WIDTH = 6 , 18 | parameter REG_IW_WIDTH = 6 , 19 | parameter REG_OW_WIDTH = 6 , 20 | parameter REG_IC_WIDTH = 6 , 21 | parameter REG_OC_WIDTH = 6 , 22 | parameter REG_AF_WIDTH = 1 , 23 | parameter REG_HBM_SFT_WIDTH = 6 , 24 | parameter REG_LBM_SFT_WIDTH = 6 25 | ) 26 | ( 27 | input wire clk , 28 | input wire rst_n , 29 | input wire [ 32 - 1 : 0] ctrl_reg , 30 | output reg [ 32 - 1 : 0] state_reg , 31 | input wire [ 32 - 1 : 0] reg0 , 32 | input wire [ 32 - 1 : 0] reg1 , 33 | input wire layer_done , 34 | output wire layer_start , 35 | output wire [ 1 : 0] stat_ctrl , 36 | output reg [ 2 : 0] cnt_layer , 37 | output reg tile_switch_r , // layer active high 38 | output reg model_switch_r , // tile active high 39 | output wire tile_switch , // pulse @negedge tile_switch_r 40 | output wire model_switch , // pulse @negedge model_switch_r 41 | output wire model_switch_layer , // layer active high, last layer in model_switch_r tile 42 | output reg nn_proc , // 0-dndm 1-sr 43 | output wire [ REG_TNX_WIDTH - 1 : 0] tile_tot_num_x , 44 | output wire [ REG_IH_WIDTH - 1 : 0] tile_in_h , 45 | output wire [ REG_OH_WIDTH - 1 : 0] tile_out_h , 46 | output wire [ REG_IW_WIDTH - 1 : 0] tile_in_w , 47 | output wire [ REG_OW_WIDTH - 1 : 0] tile_out_w , 48 | output wire [ REG_IC_WIDTH - 1 : 0] tile_in_c , 49 | output wire [ REG_OC_WIDTH - 1 : 0] tile_out_c , 50 | output wire [ 2 : 0] ksize , 51 | output wire [ 2 : 0] ksize_nxt , 52 | output wire [ 3 : 0] tile_loc , 53 | output wire x4_shuffle_vld , 54 | output wire [ REG_AF_WIDTH - 1 : 0] prl_vld , 55 | output wire [ 1 : 0] res_proc_type , 56 | output wire [ REG_HBM_SFT_WIDTH - 1 : 0] pu_hbm_shift , 57 | output wire [ REG_LBM_SFT_WIDTH - 1 : 0] pu_lbm_shift , 58 | output reg buf_pp_flag 59 | ); 60 | 61 | wire [ REG_IFMH_WIDTH - 1 : 0] ifm_h ; 62 | wire [ REG_IFMW_WIDTH - 1 : 0] ifm_w ; 63 | wire [ REG_TILEH_WIDTH - 1 : 0] tile_base_h ; 64 | wire [ REG_TNY_WIDTH - 1 : 0] tile_tot_num_y ; 65 | wire [ REG_TLW_WIDTH - 1 : 0] tile_last_w ; 66 | wire [ REG_TLH_WIDTH - 1 : 0] tile_last_h ; 67 | wire [REG_HBM_SFT_WIDTH - 1 : 0] pu_hbm_shift_dndm ; 68 | wire [REG_HBM_SFT_WIDTH - 1 : 0] pu_hbm_shift_sr ; 69 | wire [REG_LBM_SFT_WIDTH - 1 : 0] pu_lbm_shift_dndm ; 70 | wire [REG_LBM_SFT_WIDTH - 1 : 0] pu_lbm_shift_sr ; 71 | reg [ REG_TNY_WIDTH - 1 : 0] tile_cnt_y_0 ; //dndm 72 | reg [ REG_TNX_WIDTH - 1 : 0] tile_cnt_x_0 ; //dndm 73 | reg [ REG_TNY_WIDTH - 1 : 0] tile_cnt_y_1 ; //sr 74 | reg [ REG_TNX_WIDTH - 1 : 0] tile_cnt_x_1 ; //sr 75 | reg layer_start_d ; 76 | reg tile_switch_r_d ; 77 | reg model_switch_r_d ; 78 | 79 | assign stat_ctrl = ctrl_reg[1:0] ; 80 | assign ifm_h = reg0[9:0] ; 81 | assign ifm_w = reg0[19:10] ; 82 | assign tile_base_h = reg1[5:0] ; 83 | assign tile_tot_num_y = reg1[11:6] ; 84 | assign tile_tot_num_x = reg1[17:12] ; 85 | assign tile_last_w = reg1[23:18] ; 86 | assign tile_last_h = reg1[29:24] ; 87 | assign layer_start = layer_start_d ; 88 | assign tile_switch = (~tile_switch_r) & tile_switch_r_d ; 89 | assign model_switch = (~model_switch_r) & model_switch_r_d ; 90 | assign ksize = (cnt_layer == 1 || cnt_layer == 5) ? 'd5 : 'd3 ; 91 | assign ksize_nxt = (cnt_layer == 4 || cnt_layer == 5) ? 'd5 : 'd3 ; 92 | assign x4_shuffle_vld = (nn_proc == 1 && cnt_layer == 5) ? 1'b0 : 1'b0 ; 93 | assign prl_vld = (cnt_layer == 5) ? 1'b0 : 1'b1 ; 94 | assign res_proc_type = (cnt_layer == 1) ? 2'b01 : 95 | (cnt_layer == 4) ? 2'b10 : 2'b00 ; 96 | assign model_switch_layer = (cnt_layer == 5) && model_switch_r ; 97 | assign tile_loc[3] = (nn_proc == 0 && tile_cnt_x_0 == 0) || (nn_proc == 1 && tile_cnt_x_1 == 0) ; //left 98 | assign tile_loc[2] = (nn_proc == 0 && tile_cnt_x_0 == tile_tot_num_x - 1) || (nn_proc == 1 && tile_cnt_x_1 == tile_tot_num_x - 1) ; //right 99 | assign tile_loc[1] = (nn_proc == 0 && tile_cnt_y_0 == 0) || (nn_proc == 1 && tile_cnt_y_1 == 0) ; //top 100 | assign tile_loc[0] = (nn_proc == 0 && tile_cnt_y_0 == tile_tot_num_y - 1) || (nn_proc == 1 && tile_cnt_y_1 == tile_tot_num_y - 1) ; //bottom 101 | 102 | assign pu_hbm_shift_dndm = (cnt_layer == 1) ? 'h18 : 103 | (cnt_layer == 2) || (cnt_layer == 3) || (cnt_layer == 4) ? 'h16 :'h19 ; 104 | 105 | //assign pu_hbm_shift_sr = (cnt_layer == 1 || cnt_layer == 2 || cnt_layer == 3) ? 'h17 : 106 | // (cnt_layer == 4) ? 'h15 : 'h19 ; 107 | reg [REG_HBM_SFT_WIDTH - 1 : 0] pu_hbm_shift_sr_comb ; 108 | always @(cnt_layer)begin 109 | case(cnt_layer) 110 | 3'd1:pu_hbm_shift_sr_comb = 'h16; 111 | 3'd2:pu_hbm_shift_sr_comb = 'h15; 112 | 3'd3:pu_hbm_shift_sr_comb = 'h16; 113 | 3'd4:pu_hbm_shift_sr_comb = 'h14; 114 | 3'd5:pu_hbm_shift_sr_comb = 'h15; 115 | default:pu_hbm_shift_sr_comb ='h0; 116 | endcase 117 | end 118 | 119 | assign pu_hbm_shift_sr = pu_hbm_shift_sr_comb ; 120 | assign pu_hbm_shift = nn_proc ? pu_hbm_shift_sr : pu_hbm_shift_dndm ; 121 | 122 | assign pu_lbm_shift_dndm = 'h10 ; 123 | assign pu_lbm_shift_sr = 'h11 ; 124 | assign pu_lbm_shift = nn_proc ? pu_lbm_shift_sr : pu_lbm_shift_dndm ; 125 | 126 | assign tile_in_c = (nn_proc == 0 && cnt_layer == 1) ? 'd3 : 127 | (nn_proc == 1 && cnt_layer == 1) ? 'd1 : 'd16 ; 128 | assign tile_out_c = (nn_proc == 0 && cnt_layer == 5) ? 'd3 : 'd16 ; 129 | assign tile_in_w = (tile_loc[3] == 1) ? ((cnt_layer == 1) ? TILE_BASE_W : 130 | (cnt_layer == 2) ? TILE_BASE_W - 2 : 131 | (cnt_layer == 3) ? TILE_BASE_W - 3 : 132 | (cnt_layer == 4) ? TILE_BASE_W - 4 : TILE_BASE_W - 5) : 133 | (tile_loc[2] == 1) ? ((cnt_layer == 1) ? tile_last_w : 134 | (cnt_layer == 2) ? tile_last_w + 2 : 135 | (cnt_layer == 3) ? tile_last_w + 3 : 136 | (cnt_layer == 4) ? tile_last_w + 4 : tile_last_w + 5) : TILE_BASE_W; 137 | assign tile_out_w = (tile_loc[3] == 1) ? ((cnt_layer == 1) ? TILE_BASE_W - 2 : 138 | (cnt_layer == 2) ? TILE_BASE_W - 3 : 139 | (cnt_layer == 3) ? TILE_BASE_W - 4 : 140 | (cnt_layer == 4) ? TILE_BASE_W - 5 : TILE_BASE_W - 7) : 141 | (tile_loc[2] == 1) ? ((cnt_layer == 1) ? tile_last_w + 2 : 142 | (cnt_layer == 2) ? tile_last_w + 3 : 143 | (cnt_layer == 3) ? tile_last_w + 4 : 144 | (cnt_layer == 4) ? tile_last_w + 5 : tile_last_w + 7) : TILE_BASE_W; 145 | assign tile_in_h = (tile_loc[1] == 1) ? ((cnt_layer == 1) ? tile_base_h : 146 | (cnt_layer == 2) ? tile_base_h - 2 : 147 | (cnt_layer == 3) ? tile_base_h - 3 : 148 | (cnt_layer == 4) ? tile_base_h - 4 : tile_base_h - 5) : 149 | (tile_loc[0] == 1) ? ((cnt_layer == 1) ? tile_last_h : 150 | (cnt_layer == 2) ? tile_last_h + 2 : 151 | (cnt_layer == 3) ? tile_last_h + 3 : 152 | (cnt_layer == 4) ? tile_last_h + 4 : tile_last_h + 5) : tile_base_h; 153 | assign tile_out_h = (tile_loc[1] == 1) ? ((cnt_layer == 1) ? tile_base_h - 2 : 154 | (cnt_layer == 2) ? tile_base_h - 3 : 155 | (cnt_layer == 3) ? tile_base_h - 4 : 156 | (cnt_layer == 4) ? tile_base_h - 5 : tile_base_h - 7) : 157 | (tile_loc[0] == 1) ? ((cnt_layer == 1) ? tile_last_h + 2 : 158 | (cnt_layer == 2) ? tile_last_h + 3 : 159 | (cnt_layer == 3) ? tile_last_h + 4 : 160 | (cnt_layer == 4) ? tile_last_h + 5 : tile_last_h + 7) : tile_base_h; 161 | 162 | always@(posedge clk or negedge rst_n)begin 163 | if(!rst_n) 164 | tile_cnt_x_0 <= 0; 165 | else if(nn_proc == 0 && layer_done && tile_switch_r) 166 | tile_cnt_x_0 <= (tile_cnt_x_0 == tile_tot_num_x - 1) ? 0 : tile_cnt_x_0 + 1; 167 | else 168 | tile_cnt_x_0 <= tile_cnt_x_0; 169 | end 170 | 171 | always@(posedge clk or negedge rst_n)begin 172 | if(!rst_n) 173 | tile_cnt_y_0 <= 0; 174 | else if(nn_proc == 0 && layer_done && tile_switch_r) 175 | tile_cnt_y_0 <= (tile_cnt_x_0 == tile_tot_num_x - 1) ? tile_cnt_y_0 + 1 : tile_cnt_y_0; 176 | else 177 | tile_cnt_y_0 <= tile_cnt_y_0; 178 | end 179 | 180 | always@(posedge clk or negedge rst_n)begin 181 | if(!rst_n) 182 | tile_cnt_x_1 <= 0; 183 | else if(nn_proc == 1 && layer_done && tile_switch_r) 184 | tile_cnt_x_1 <= (tile_cnt_x_1 == tile_tot_num_x - 1) ? 0 : tile_cnt_x_1 + 1; 185 | else 186 | tile_cnt_x_1 <= tile_cnt_x_1; 187 | end 188 | 189 | always@(posedge clk or negedge rst_n)begin 190 | if(!rst_n) 191 | tile_cnt_y_1 <= 0; 192 | else if(nn_proc == 1 && layer_done && tile_switch_r) 193 | tile_cnt_y_1 <= (tile_cnt_x_1 == tile_tot_num_x - 1) ? tile_cnt_y_1 + 1 : tile_cnt_y_1; 194 | else 195 | tile_cnt_y_1 <= tile_cnt_y_1; 196 | end 197 | 198 | always@(posedge clk or negedge rst_n)begin 199 | if(!rst_n) 200 | tile_switch_r <= 0; 201 | else if(layer_done && cnt_layer == 4) 202 | tile_switch_r <= 1; 203 | else if(layer_done && cnt_layer == 5) 204 | tile_switch_r <= 0; 205 | else 206 | tile_switch_r <= tile_switch_r; 207 | end 208 | 209 | always@(posedge clk or negedge rst_n)begin 210 | if(!rst_n) 211 | model_switch_r <= 0; 212 | else if(layer_done && cnt_layer == 5 && (((tile_cnt_x_0 == tile_tot_num_x - 2) && ((tile_cnt_y_0[0] == 1) || (tile_cnt_y_0 == tile_tot_num_y - 1))) || ((tile_cnt_x_1 == tile_tot_num_x - 2) && ((tile_cnt_y_1[0] == 1) || (tile_cnt_y_1 == tile_tot_num_y - 1))))) 213 | model_switch_r <= 1; 214 | else if(layer_done && cnt_layer == 5 && (((tile_cnt_x_0 == tile_tot_num_x - 1) && ((tile_cnt_y_0[0] == 1) || (tile_cnt_y_0 == tile_tot_num_y - 1))) || ((tile_cnt_x_1 == tile_tot_num_x - 1) && ((tile_cnt_y_1[0] == 1) || (tile_cnt_y_1 == tile_tot_num_y - 1))))) 215 | model_switch_r <= 0; 216 | else 217 | model_switch_r <= model_switch_r; 218 | end 219 | 220 | always@(posedge clk or negedge rst_n)begin 221 | if(!rst_n) 222 | layer_start_d <= 0; 223 | else if(cnt_layer == 5 && tile_cnt_x_1 == tile_tot_num_x - 1 && tile_cnt_y_1 == tile_tot_num_y - 1) 224 | layer_start_d <= 0; 225 | else 226 | layer_start_d <= (ctrl_reg[1:0] == 2'b11) || layer_done; 227 | end 228 | 229 | always@(posedge clk or negedge rst_n)begin 230 | if(!rst_n)begin 231 | tile_switch_r_d <= 0; 232 | model_switch_r_d <= 0; 233 | end 234 | else begin 235 | tile_switch_r_d <= tile_switch_r; 236 | model_switch_r_d <= model_switch_r; 237 | end 238 | end 239 | 240 | always@(posedge clk or negedge rst_n)begin //layer_cnt 1 ~ 5 241 | if(!rst_n) 242 | cnt_layer <= 1; 243 | else if(layer_done && tile_switch_r) 244 | cnt_layer <= 1; 245 | else if(layer_done && !tile_switch_r) 246 | cnt_layer <= cnt_layer + 1; 247 | else 248 | cnt_layer <= cnt_layer; 249 | end 250 | 251 | always@(posedge clk or negedge rst_n)begin 252 | if(!rst_n) 253 | nn_proc <= 0; 254 | else if(layer_done && model_switch_layer) 255 | nn_proc <= ~nn_proc; 256 | else 257 | nn_proc <= nn_proc; 258 | end 259 | //modify when tb 260 | /* 261 | always@(posedge clk or negedge rst_n)begin 262 | if(!rst_n) 263 | nn_proc <= 0; 264 | else if(layer_done && model_switch_layer) 265 | nn_proc <= 1; 266 | else 267 | nn_proc <= 1; 268 | end*/ 269 | // top dla fsm 270 | localparam IDLE = 1'b0; 271 | localparam CMPT = 1'b1; 272 | 273 | reg cur_state; 274 | reg next_state; 275 | 276 | always@(posedge clk or negedge rst_n)begin 277 | if(!rst_n) 278 | cur_state <= IDLE; 279 | else 280 | cur_state <= next_state; 281 | end 282 | 283 | always@(*)begin 284 | case(cur_state) 285 | IDLE:begin 286 | if(ctrl_reg[1:0] == 2'b11) 287 | next_state = CMPT; 288 | else 289 | next_state = IDLE; 290 | end 291 | CMPT:begin 292 | if(ctrl_reg[1:0] == 2'b01 || ((tile_cnt_x_1 == tile_tot_num_x - 1) && (tile_cnt_y_1 == tile_tot_num_y - 1) && (cnt_layer == 5) && layer_done)) 293 | next_state = IDLE; 294 | else 295 | next_state = CMPT; 296 | end 297 | default: 298 | next_state = IDLE; 299 | endcase 300 | end 301 | 302 | always@(posedge clk or negedge rst_n)begin 303 | if(!rst_n) 304 | state_reg[1:0] <= 2'b01; 305 | else 306 | case(next_state) 307 | IDLE:begin 308 | state_reg[1:0] <= 2'b01; 309 | end 310 | CMPT:begin 311 | state_reg[1:0] <= 2'b11; 312 | end 313 | default:begin 314 | state_reg[1:0] <= 2'b01; 315 | end 316 | endcase 317 | end 318 | 319 | // weight & param buf ping-pong fsm 320 | localparam A0 = 2'b00; 321 | localparam SP0_A1 = 2'b01; 322 | localparam A0_SP1 = 2'b11; 323 | 324 | reg [1:0] cur_state_0; 325 | reg [1:0] next_state_0; 326 | 327 | always@(posedge clk or negedge rst_n)begin 328 | if(!rst_n) 329 | cur_state_0 <= A0; 330 | else 331 | cur_state_0 <= next_state_0; 332 | end 333 | 334 | always@(*)begin 335 | case(cur_state_0) 336 | A0:begin 337 | if(stat_ctrl == 2'b10) 338 | next_state_0 = SP0_A1; 339 | else 340 | next_state_0 = A0; 341 | end 342 | SP0_A1:begin 343 | if(layer_done && model_switch_layer) 344 | next_state_0 = A0_SP1; 345 | else 346 | next_state_0 = SP0_A1; 347 | end 348 | A0_SP1:begin 349 | if(layer_done && model_switch_layer) 350 | next_state_0 = SP0_A1; 351 | else 352 | next_state_0 = A0_SP1; 353 | end 354 | default: 355 | next_state_0 = A0; 356 | endcase 357 | end 358 | 359 | always@(posedge clk or negedge rst_n)begin 360 | if(!rst_n) 361 | buf_pp_flag <= 0; 362 | else begin 363 | case(cur_state_0) 364 | A0: 365 | buf_pp_flag <= 0; 366 | SP0_A1: 367 | buf_pp_flag <= 1; 368 | A0_SP1: 369 | buf_pp_flag <= 0; 370 | default: 371 | buf_pp_flag <= 0; 372 | endcase 373 | end 374 | end 375 | 376 | endmodule -------------------------------------------------------------------------------- /rtl/dp_ram.v: -------------------------------------------------------------------------------- 1 | module dp_ram #( 2 | parameter ADDR_WIDTH = 10, 3 | parameter DATA_WIDTH = 256, 4 | parameter DATA_DEPTH = 1024 5 | )( 6 | input wire clk, 7 | input wire [ ADDR_WIDTH-1:0] wr_addr, 8 | input wire wr_en, 9 | input wire [ DATA_WIDTH-1:0] wr_data, 10 | input wire [ ADDR_WIDTH-1:0] rd_addr, 11 | input wire rd_en, 12 | output reg [ DATA_WIDTH-1:0] rd_data 13 | ); 14 | 15 | reg [ DATA_WIDTH-1:0] data_buf [ DATA_DEPTH-1:0]; 16 | 17 | always@(posedge clk) begin 18 | if (wr_en) begin 19 | data_buf[wr_addr] <= wr_data; 20 | end 21 | end 22 | 23 | always @(posedge clk) begin 24 | if (rd_en) begin 25 | rd_data <= data_buf[rd_addr]; 26 | end 27 | else begin 28 | rd_data <= rd_data; 29 | end 30 | end 31 | 32 | endmodule -------------------------------------------------------------------------------- /rtl/dp_ram_regout.v: -------------------------------------------------------------------------------- 1 | module dp_ram_regout #( 2 | parameter KNOB_REGOUT = 0, 3 | parameter ADDR_WIDTH = 10, 4 | parameter DATA_WIDTH = 256, 5 | parameter DATA_DEPTH = 1024 6 | )( 7 | input wire clk, 8 | input wire [ ADDR_WIDTH-1:0] wr_addr, 9 | input wire wr_en, 10 | input wire [ DATA_WIDTH-1:0] wr_data, 11 | input wire [ ADDR_WIDTH-1:0] rd_addr, 12 | input wire rd_en, 13 | output wire [ DATA_WIDTH-1:0] rd_data 14 | ); 15 | 16 | reg [ DATA_WIDTH-1:0] data_buf [ DATA_DEPTH-1:0]; 17 | reg [DATA_WIDTH + DATA_WIDTH * KNOB_REGOUT - 1 : 0] data_dly_r; 18 | 19 | always@(posedge clk) begin 20 | if (wr_en) begin 21 | data_buf[wr_addr] <= wr_data; 22 | end 23 | end 24 | 25 | always @(posedge clk) begin 26 | if (rd_en) begin 27 | data_dly_r <= {data_dly_r ,data_buf[rd_addr]}; 28 | end 29 | else begin 30 | data_dly_r <= data_dly_r; 31 | end 32 | end 33 | 34 | assign rd_data = data_dly_r[DATA_WIDTH + DATA_WIDTH * KNOB_REGOUT - 1 : DATA_WIDTH * KNOB_REGOUT]; 35 | 36 | endmodule -------------------------------------------------------------------------------- /rtl/param_buf.v: -------------------------------------------------------------------------------- 1 | /* 2 | Top Module: param_buf.v 3 | Author: Hao Zhang 4 | Time: 202308 5 | */ 6 | 7 | module param_buf#( 8 | parameter BIAS_DATA_WIDTH = 16 , 9 | parameter HBM_DATA_WIDTH = 16 , 10 | parameter LBM_DATA_WIDTH = 16 , 11 | parameter OC_NUM = 4 , 12 | parameter P_ADDR_WIDTH = 5 , 13 | parameter P_BUF0_DEPTH = 17 , //DNDM 14 | parameter P_BUF1_DEPTH = 20 , //SR 15 | parameter P_BUF_WIDTH = (BIAS_DATA_WIDTH + HBM_DATA_WIDTH + LBM_DATA_WIDTH) * OC_NUM , 16 | parameter P2PU_RD_WIDTH = BIAS_DATA_WIDTH + HBM_DATA_WIDTH + LBM_DATA_WIDTH 17 | ) 18 | ( 19 | input wire clk , 20 | input wire rst_n , 21 | // control 22 | input wire buf_pp_flag , 23 | // axi 24 | input wire [ P_ADDR_WIDTH - 1 : 0] axi2p_waddr , 25 | input wire axi2p_wen , 26 | input wire [ P_BUF_WIDTH - 1 : 0] axi2p_wdata , 27 | input wire [ P_ADDR_WIDTH - 1 : 0] axi2p_raddr , 28 | input wire axi2p_ren , 29 | output wire [ P_BUF_WIDTH - 1 : 0] axi2p_rdata , 30 | // buf_rd 31 | input wire pu2p_ren , 32 | input wire [ P_ADDR_WIDTH - 1 : 0] pu2p_raddr , 33 | output wire [ P2PU_RD_WIDTH - 1 : 0] p2pu_rdata_0 , //c 0/4... 34 | output wire [ P2PU_RD_WIDTH - 1 : 0] p2pu_rdata_1 , //c 1/5... 35 | output wire [ P2PU_RD_WIDTH - 1 : 0] p2pu_rdata_2 , //c 2/6... 36 | output wire [ P2PU_RD_WIDTH - 1 : 0] p2pu_rdata_3 //c 3/7... 37 | ); 38 | 39 | wire [ P_ADDR_WIDTH - 1 : 0] b0_waddr ; 40 | wire b0_wen ; 41 | wire [ P_BUF_WIDTH - 1 : 0] b0_wdata ; 42 | wire [ P_ADDR_WIDTH - 1 : 0] b0_raddr ; 43 | wire b0_ren ; 44 | wire [ P_BUF_WIDTH - 1 : 0] b0_rdata ; 45 | wire [ P_ADDR_WIDTH - 1 : 0] b1_waddr ; 46 | wire b1_wen ; 47 | wire [ P_BUF_WIDTH - 1 : 0] b1_wdata ; 48 | wire [ P_ADDR_WIDTH - 1 : 0] b1_raddr ; 49 | wire b1_ren ; 50 | wire [ P_BUF_WIDTH - 1 : 0] b1_rdata ; 51 | 52 | // buffer_wr & buffer_rd 53 | assign b0_waddr = axi2p_waddr; 54 | assign b0_wen = (buf_pp_flag == 0) ? axi2p_wen : 0; 55 | assign b0_wdata = axi2p_wdata; 56 | assign b0_raddr = (buf_pp_flag == 0) ? axi2p_raddr : pu2p_raddr; 57 | assign b0_ren = (buf_pp_flag == 0) ? axi2p_ren : pu2p_ren; 58 | assign b1_waddr = axi2p_waddr; 59 | assign b1_wen = (buf_pp_flag == 1) ? axi2p_wen : 0; 60 | assign b1_wdata = axi2p_wdata; 61 | assign b1_raddr = (buf_pp_flag == 1) ? axi2p_raddr : pu2p_raddr; 62 | assign b1_ren = (buf_pp_flag == 1) ? axi2p_ren : pu2p_ren; 63 | assign axi2p_rdata = (buf_pp_flag == 0) ? b0_rdata : b1_rdata; 64 | assign p2pu_rdata_0 = (buf_pp_flag == 0) ? b1_rdata[1*P2PU_RD_WIDTH - 1 : 0*P2PU_RD_WIDTH] : b0_rdata[1*P2PU_RD_WIDTH - 1 : 0*P2PU_RD_WIDTH]; 65 | assign p2pu_rdata_1 = (buf_pp_flag == 0) ? b1_rdata[2*P2PU_RD_WIDTH - 1 : 1*P2PU_RD_WIDTH] : b0_rdata[2*P2PU_RD_WIDTH - 1 : 1*P2PU_RD_WIDTH]; 66 | assign p2pu_rdata_2 = (buf_pp_flag == 0) ? b1_rdata[3*P2PU_RD_WIDTH - 1 : 2*P2PU_RD_WIDTH] : b0_rdata[3*P2PU_RD_WIDTH - 1 : 2*P2PU_RD_WIDTH]; 67 | assign p2pu_rdata_3 = (buf_pp_flag == 0) ? b1_rdata[4*P2PU_RD_WIDTH - 1 : 3*P2PU_RD_WIDTH] : b0_rdata[4*P2PU_RD_WIDTH - 1 : 3*P2PU_RD_WIDTH]; 68 | 69 | // bias ping-pong buffer instantiation 70 | dp_ram #( 71 | .ADDR_WIDTH (P_ADDR_WIDTH ), 72 | .DATA_WIDTH (P_BUF_WIDTH ), 73 | .DATA_DEPTH (P_BUF0_DEPTH ) 74 | ) 75 | u_b0_buf( //DNDM 76 | .clk (clk ), 77 | .wr_addr (b0_waddr ), 78 | .wr_en (b0_wen ), 79 | .wr_data (b0_wdata ), 80 | .rd_addr (b0_raddr ), 81 | .rd_en (b0_ren ), 82 | .rd_data (b0_rdata ) 83 | ); 84 | dp_ram #( //SR 85 | .ADDR_WIDTH (P_ADDR_WIDTH ), 86 | .DATA_WIDTH (P_BUF_WIDTH ), 87 | .DATA_DEPTH (P_BUF1_DEPTH ) 88 | ) 89 | u_b1_buf( 90 | .clk (clk ), 91 | .wr_addr (b1_waddr ), 92 | .wr_en (b1_wen ), 93 | .wr_data (b1_wdata ), 94 | .rd_addr (b1_raddr ), 95 | .rd_en (b1_ren ), 96 | .rd_data (b1_rdata ) 97 | ); 98 | 99 | endmodule -------------------------------------------------------------------------------- /rtl/pe_array/pe.v: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | > File Name: pe.v 3 | > Author: kehongbo 4 | > Mail: 5 | > Created Time: Sun 6 Aug 2023 12:03:22 PM CST 6 | > Description: 7 | ************************************************************************/ 8 | 9 | 10 | //------------------------------------------------------------------------------ 11 | // 12 | // Modified : 2023-8-13 by WYH 13 | // Description : add signed number proc 14 | 15 | 16 | //------------------------------------------------------------------------------ 17 | module pe#( 18 | parameter FEATURE_WD = 8, 19 | parameter WEIGHT_WD = 8, 20 | parameter PE_OUTPUT_WD = 18 21 | ) 22 | ( 23 | input clk , 24 | input rstn , 25 | input clr_i , 26 | input signed [FEATURE_WD -1: 0] pe_row_input , 27 | input signed [WEIGHT_WD -1: 0] pe_row_weight , 28 | output [PE_OUTPUT_WD -1: 0] pe_row_output , 29 | input [1 -1: 0] pe_col_vld , 30 | input [1 -1: 0] pe_row_vld , 31 | input [1 -1: 0] pe_array_vld 32 | ); 33 | 34 | reg signed [PE_OUTPUT_WD -1: 0] pe_out_r ; 35 | wire accum_ena_w ; 36 | (*use_dsp = "yes"*)wire signed [PE_OUTPUT_WD : 0] prod_w ; 37 | 38 | assign accum_ena_w = pe_col_vld & pe_row_vld & pe_array_vld; 39 | assign prod_w = pe_row_input * pe_row_weight + pe_out_r; 40 | always @(posedge clk or negedge rstn) begin 41 | if(!rstn) begin 42 | pe_out_r <= 'd0 ; 43 | end 44 | else begin 45 | if(clr_i) 46 | pe_out_r <= 'd0 ; 47 | else if(accum_ena_w) 48 | pe_out_r <= prod_w; 49 | end 50 | end 51 | 52 | assign pe_row_output = pe_out_r; 53 | 54 | 55 | endmodule 56 | -------------------------------------------------------------------------------- /rtl/pe_array/pe2.v: -------------------------------------------------------------------------------- 1 | //`define FPGA 2 | module pe2#( 3 | parameter FEATURE_WD = 8, 4 | parameter WEIGHT_WD = 8, 5 | parameter PE_OUTPUT_WD = 18 6 | )( 7 | input clk , 8 | input rstn , 9 | input clr_i , 10 | input [2 * FEATURE_WD -1: 0] pe_row_input , 11 | input [WEIGHT_WD -1: 0] pe_row_weight , 12 | output [2 * PE_OUTPUT_WD -1: 0] pe_row_output , 13 | input [2 -1: 0] pe_col_vld , 14 | input [1 -1: 0] pe_row_vld , 15 | input [1 -1: 0] pe_array_vld 16 | ); 17 | // function : pack 2 mac into 1 module 18 | 19 | 20 | /************************ reg & wire ********************************/ 21 | 22 | `ifdef FPGA 23 | reg signed [36 -1: 0] pe_out_r ; 24 | reg signed [36 -1: 0] pe_out_w ; 25 | wire signed [2 -1: 0] accum_ena_w ; 26 | wire signed [FEATURE_WD + WEIGHT_WD -1: 0] prod_w ; 27 | wire signed [28 -1: 0] dsp_28_i_w ; 28 | wire signed [18 -1: 0] dsp_18_i_w ; 29 | wire signed [36 -1: 0] dsp_36_i_w ; 30 | wire signed [36 -1: 0] dsp_36_o_w ; 31 | wire signed [10 -1: 0] pe_row_1_w ; 32 | wire signed [10 -1: 0] pe_row_0_w ; 33 | wire signed [1 -1: 0] refined_num_w ; 34 | wire signed [18 -1: 0] pe_row_1_ref_w ; 35 | wire signed [8 -1: 0] pe_row_weight_w ; 36 | 37 | 38 | 39 | // using dsp to implement a(27 bit) * b(18 bit) + c(48 bit) 40 | assign pe_row_1_w = pe_row_input[15:8]; 41 | assign pe_row_0_w = pe_row_input[7:0]; 42 | assign pe_row_weight_w = pe_row_weight; 43 | assign accum_ena_w = {pe_col_vld[1] & pe_row_vld & pe_array_vld, pe_col_vld[0] & pe_row_vld & pe_array_vld}; 44 | assign dsp_28_i_w = {{2{pe_row_1_w[7]}}, pe_row_1_w, {8{pe_row_0_w[7]}}, {2{pe_row_0_w[7]}}, pe_row_0_w}; 45 | //assign dsp_18_i_w = {{10{pe_row_weight[7]}}, pe_row_weight}; 46 | assign refined_num_w = pe_row_0_w[7] ^ pe_row_weight[7]; 47 | 48 | assign pe_row_1_ref_w = $signed(pe_out_r[35:18]) + refined_num_w; 49 | assign dsp_36_i_w = {pe_row_1_ref_w, pe_out_r[17:0]}; 50 | // pe2 mul need to be refined 51 | (*use_dsp = "yes"*)assign dsp_36_o_w = dsp_28_i_w * pe_row_weight_w ; 52 | 53 | 54 | 55 | always @(*) begin 56 | case(accum_ena_w) 57 | 2'd0: pe_out_w = pe_out_r; 58 | 2'd1: pe_out_w = {pe_out_r[35:18], dsp_36_o_w[17:0]}; 59 | 2'd2: pe_out_w = {dsp_36_o_w[35:18], pe_out_r[17:0]}; 60 | 2'd3: pe_out_w = {dsp_36_o_w[35:18], dsp_36_o_w[17:0]}; 61 | endcase 62 | end 63 | 64 | always @(posedge clk or negedge rstn) begin 65 | if(~rstn) 66 | pe_out_r <= 'd0; 67 | else if(clr_i) 68 | pe_out_r <= 'd0; 69 | else 70 | pe_out_r <= pe_out_w; 71 | end 72 | 73 | assign pe_row_output = pe_out_r; 74 | 75 | 76 | 77 | // debug circuit 78 | wire signed [18 -1: 0] pe_debug_1_w ; 79 | wire signed [18 -1: 0] pe_debug_0_w ; 80 | wire signed [18 -1: 0] pe_dut_1_w ; 81 | wire signed [18 -1: 0] pe_dut_0_w ; 82 | 83 | 84 | assign pe_dut_1_w = dsp_36_o_w[35:18]; 85 | assign pe_dut_0_w = dsp_36_o_w[17:0]; 86 | 87 | assign pe_debug_1_w = pe_row_1_w * pe_row_weight_w; 88 | assign pe_debug_0_w = pe_row_0_w * pe_row_weight_w; 89 | 90 | initial begin 91 | while (rstn!==0) begin 92 | @(posedge clk); 93 | end 94 | while (rstn===0) begin 95 | @(posedge clk); 96 | end 97 | while (1) begin 98 | if(pe_dut_1_w != pe_debug_1_w) begin 99 | $display("MISMATCH!!!"); 100 | $display("%d", pe_out_r[35:18]); 101 | $display("%d %d %d %d", pe_dut_1_w, pe_dut_0_w, pe_debug_1_w, pe_debug_0_w); 102 | $display("%d %d", pe_row_1_w, pe_row_weight); 103 | $display("%d %d", pe_row_0_w, pe_row_weight); 104 | $finish(); 105 | end 106 | @(posedge clk); 107 | end 108 | end 109 | 110 | `else 111 | pe #( 112 | .FEATURE_WD (FEATURE_WD ), 113 | .WEIGHT_WD (WEIGHT_WD ), 114 | .PE_OUTPUT_WD (PE_OUTPUT_WD ) 115 | )pe_0( 116 | .clk (clk ), 117 | .rstn (rstn ), 118 | .clr_i (clr_i ), 119 | .pe_row_input (pe_row_input[0 +: FEATURE_WD] ), 120 | .pe_row_weight (pe_row_weight ), 121 | .pe_row_output (pe_row_output[0 +: PE_OUTPUT_WD] ), 122 | .pe_col_vld (pe_col_vld[0] ), 123 | .pe_row_vld (pe_row_vld ), 124 | .pe_array_vld (pe_array_vld ) 125 | ); 126 | 127 | pe #( 128 | .FEATURE_WD (FEATURE_WD ), 129 | .WEIGHT_WD (WEIGHT_WD ), 130 | .PE_OUTPUT_WD (PE_OUTPUT_WD ) 131 | )pe_1( 132 | .clk (clk ), 133 | .rstn (rstn ), 134 | .clr_i (clr_i ), 135 | .pe_row_input (pe_row_input[FEATURE_WD +: FEATURE_WD] ), 136 | .pe_row_weight (pe_row_weight ), 137 | .pe_row_output (pe_row_output[PE_OUTPUT_WD +: PE_OUTPUT_WD]), 138 | .pe_col_vld (pe_col_vld[1] ), 139 | .pe_row_vld (pe_row_vld ), 140 | .pe_array_vld (pe_array_vld ) 141 | ); 142 | 143 | `endif 144 | 145 | endmodule 146 | -------------------------------------------------------------------------------- /rtl/pu/pu_adder2.v: -------------------------------------------------------------------------------- 1 | module pu_adder2#( 2 | parameter INPUT_WD1 = 20, 3 | parameter INPUT_WD2 = 16, 4 | parameter OUTPUT_WD = 20 5 | )( 6 | input [INPUT_WD1 -1 : 0] op1_i , 7 | input [INPUT_WD2 -1 : 0] op2_i , 8 | output [OUTPUT_WD -1 : 0] acc_o 9 | ); 10 | 11 | wire [OUTPUT_WD - 1 : 0] level_0_1_w; 12 | wire [OUTPUT_WD - 1 : 0] level_0_2_w; 13 | wire [OUTPUT_WD - 1 : 0] level_1_1_w; 14 | 15 | 16 | /*************** dbg signals ****************/ 17 | wire mon_overflow1; 18 | 19 | 20 | 21 | //assign level_0_1_w = {{(OUTPUT_WD - INPUT_WD2){1'b0}},op1_i }; 22 | //assign level_0_2_w = {{(OUTPUT_WD - INPUT_WD2){1'b0}},op2_i }; 23 | assign level_0_1_w = {{(OUTPUT_WD - INPUT_WD1){op1_i[INPUT_WD1 - 1]}}, op1_i}; 24 | assign level_0_2_w = {{(OUTPUT_WD - INPUT_WD2){op2_i[INPUT_WD2 - 1]}}, op2_i}; 25 | 26 | assign {mon_overflow1, level_1_1_w} = { {level_0_1_w[OUTPUT_WD-1]}, level_0_1_w} + {{level_0_1_w[OUTPUT_WD-1]}, level_0_2_w} ; 27 | 28 | 29 | assign acc_o = level_1_1_w; 30 | 31 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_adder4.v: -------------------------------------------------------------------------------- 1 | module pu_adder4#( 2 | parameter PE_OUTPUT_WD = 18, 3 | parameter ACCUM_WD = 20 4 | )( 5 | input [PE_OUTPUT_WD -1 : 0] pe_rf_ic1_i, 6 | input [PE_OUTPUT_WD -1 : 0] pe_rf_ic2_i, 7 | input [PE_OUTPUT_WD -1 : 0] pe_rf_ic3_i, 8 | input [PE_OUTPUT_WD -1 : 0] pe_rf_ic4_i, 9 | output [ACCUM_WD -1 : 0] accum_o 10 | ); 11 | 12 | wire [ACCUM_WD - 1 : 0] level_0_1_w; 13 | wire [ACCUM_WD - 1 : 0] level_0_2_w; 14 | wire [ACCUM_WD - 1 : 0] level_0_3_w; 15 | wire [ACCUM_WD - 1 : 0] level_1_1_w; 16 | 17 | /*************** dbg signals ****************/ 18 | wire mon_overflow1; 19 | wire mon_overflow2; 20 | wire mon_overflow3; 21 | wire mon_overflow4; 22 | 23 | assign {level_0_1_w} = { {(ACCUM_WD - PE_OUTPUT_WD){pe_rf_ic1_i[PE_OUTPUT_WD - 1]}}, pe_rf_ic1_i} + {{(ACCUM_WD - PE_OUTPUT_WD){pe_rf_ic2_i[PE_OUTPUT_WD - 1]}}, pe_rf_ic2_i} ; 24 | assign {level_0_2_w} = { {(ACCUM_WD - PE_OUTPUT_WD){pe_rf_ic3_i[PE_OUTPUT_WD - 1]}}, pe_rf_ic3_i} + {{(ACCUM_WD - PE_OUTPUT_WD){pe_rf_ic4_i[PE_OUTPUT_WD - 1]}}, pe_rf_ic4_i} ; 25 | 26 | assign {level_1_1_w} = {level_0_1_w} + {level_0_2_w} ; 27 | 28 | assign accum_o = level_1_1_w; 29 | 30 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_bias_add_pipe1.v: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | > File Name: pu_bias_add_pipe1.v 3 | > Author: YuhengWei 4 | > Mail: 5 | > Created Time: Sun 6 Aug 2023 12:03:22 PM CST 6 | > Description: 7 | ************************************************************************/ 8 | 9 | module pu_bias_add_pipe1 #( 10 | parameter PE_OUTPUT_WD = 20 , 11 | parameter BIAS_WD = 16 , 12 | parameter PE_COL_NUM = 32 , 13 | parameter ACCUM_OUTPUT_WD = 20 14 | 15 | )( 16 | 17 | input clk , 18 | input rstn , 19 | 20 | // 1h 4oc per cycles 21 | // oc_h 22 | input pu_accum_bias_p1_vld_i , 23 | output pu_accum_bias_p1_rdy_o , 24 | 25 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] acc_0_i , // one row of oc0 26 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] acc_1_i , // one row of oc1 27 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] acc_2_i , // one row of oc2 28 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] acc_3_i , // one row of oc3 29 | 30 | input [BIAS_WD -1: 0] bias_oc0_i , 31 | input [BIAS_WD -1: 0] bias_oc1_i , 32 | input [BIAS_WD -1: 0] bias_oc2_i , 33 | input [BIAS_WD -1: 0] bias_oc3_i , 34 | 35 | output pu_accum_bias_p1_vld_o , 36 | input pu_accum_bias_p1_rdy_i , 37 | 38 | output [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc0_o , 39 | output [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc1_o , 40 | output [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc2_o , 41 | output [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc3_o 42 | 43 | ); 44 | 45 | 46 | //----------------------------- 47 | 48 | // WIRE & REG 49 | 50 | // 51 | 52 | //----------------------------- 53 | reg vld_r ; 54 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc0_r ; 55 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc1_r ; 56 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc2_r ; 57 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc3_r ; 58 | 59 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc0_w ; 60 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc1_w ; 61 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc2_w ; 62 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] conv_oc3_w ; 63 | 64 | 65 | 66 | 67 | 68 | genvar i; 69 | 70 | 71 | //---------------------------------------------------------------------------------------------------------- 72 | 73 | // ADD BIAS TO ONE ROW OF OC0 74 | 75 | //---------------------------------------------------------------------------------------------------------- 76 | 77 | generate 78 | 79 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC0 80 | 81 | pu_adder2 #( 82 | .INPUT_WD1(PE_OUTPUT_WD ), 83 | .INPUT_WD2(BIAS_WD ), 84 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 85 | ) 86 | pu_adder_oc0( 87 | .op1_i(acc_0_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 88 | .op2_i(bias_oc0_i ) , //fanout to 32 adder2 89 | .acc_o(conv_oc0_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 90 | ); 91 | 92 | end 93 | 94 | endgenerate 95 | 96 | 97 | //---------------------------------------------------------------------------------------------------------- 98 | 99 | // ADD BIAS TO ONE ROW OF OC1 100 | 101 | //---------------------------------------------------------------------------------------------------------- 102 | 103 | generate 104 | 105 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC1 106 | 107 | pu_adder2 #( 108 | .INPUT_WD1(PE_OUTPUT_WD ), 109 | .INPUT_WD2(BIAS_WD ), 110 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 111 | ) 112 | pu_adder_oc1( 113 | .op1_i(acc_1_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 114 | .op2_i(bias_oc1_i ) , //fanout to 32 adder2 115 | .acc_o(conv_oc1_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 116 | ); 117 | 118 | end 119 | 120 | endgenerate 121 | 122 | //---------------------------------------------------------------------------------------------------------- 123 | 124 | // ADD BIAS TO ONE ROW OF OC2 125 | 126 | //---------------------------------------------------------------------------------------------------------- 127 | 128 | generate 129 | 130 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC2 131 | 132 | pu_adder2 #( 133 | .INPUT_WD1(PE_OUTPUT_WD ), 134 | .INPUT_WD2(BIAS_WD ), 135 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 136 | ) 137 | pu_adder_oc2( 138 | .op1_i(acc_2_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 139 | .op2_i(bias_oc2_i ) , //fanout to 32 adder2 140 | .acc_o(conv_oc2_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 141 | ); 142 | 143 | end 144 | 145 | endgenerate 146 | 147 | //---------------------------------------------------------------------------------------------------------- 148 | 149 | // ADD BIAS TO ONE ROW OF OC3 150 | 151 | //---------------------------------------------------------------------------------------------------------- 152 | 153 | generate 154 | 155 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC3 156 | 157 | pu_adder2 #( 158 | .INPUT_WD1(PE_OUTPUT_WD ), 159 | .INPUT_WD2(BIAS_WD ), 160 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 161 | ) 162 | pu_adder_oc3( 163 | .op1_i(acc_3_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 164 | .op2_i(bias_oc3_i ) , //fanout to 32 adder2 165 | .acc_o(conv_oc3_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 166 | ); 167 | 168 | end 169 | 170 | endgenerate 171 | 172 | 173 | 174 | // bubble collapse 175 | 176 | assign pu_accum_bias_p1_rdy_o = ~vld_r | pu_accum_bias_p1_rdy_i ; 177 | 178 | always@(posedge clk or negedge rstn) begin 179 | if(~rstn)begin 180 | vld_r <= 'b0; 181 | end 182 | else if(~vld_r | pu_accum_bias_p1_rdy_i )begin 183 | vld_r <= pu_accum_bias_p1_vld_i; 184 | end 185 | end 186 | 187 | always @(posedge clk) begin 188 | if(pu_accum_bias_p1_rdy_o && pu_accum_bias_p1_vld_i)begin 189 | conv_oc0_r <= conv_oc0_w ; 190 | conv_oc1_r <= conv_oc1_w ; 191 | conv_oc2_r <= conv_oc2_w ; 192 | conv_oc3_r <= conv_oc3_w ; 193 | end 194 | end 195 | 196 | 197 | assign pu_accum_bias_p1_vld_o = vld_r ; 198 | 199 | assign conv_oc0_o = conv_oc0_r ; 200 | assign conv_oc1_o = conv_oc1_r ; 201 | assign conv_oc2_o = conv_oc2_r ; 202 | assign conv_oc3_o = conv_oc3_r ; 203 | 204 | 205 | 206 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_mul.v: -------------------------------------------------------------------------------- 1 | module pu_mul#( 2 | parameter INPUT_WD1 = 20, 3 | parameter INPUT_WD2 = 16, 4 | parameter OUTPUT_WD = 36 5 | )( 6 | input signed [INPUT_WD1 -1 : 0] op1_i , 7 | input [INPUT_WD2 -1 : 0] op2_i , 8 | output signed [OUTPUT_WD -1 : 0] mul_o 9 | ); 10 | wire signed [INPUT_WD2 : 0] op2_w; 11 | assign op2_w = {1'b0, op2_i}; 12 | assign mul_o = op1_i * op2_w; 13 | 14 | /* 15 | wire [INPUT_WD1 + INPUT_WD2 - 1 : 0] unsigned_mul_w ; 16 | wire [OUTPUT_WD - 1 : 0] shift_mul_w ; 17 | 18 | wire [OUTPUT_WD - 1 : 0] signed_mul_w ; 19 | 20 | wire [INPUT_WD1 - 1 : 0] op1_w ; 21 | wire [INPUT_WD2 - 1 : 0] op2_w ; 22 | 23 | assign op1_w = op1_i[INPUT_WD1 - 1] ? ( ~op1_i + 'd1 ) : op1_i ; 24 | // assign op2_w = op2_i[INPUT_WD2 - 1] ? ( ~op2_i + 'd1 ) : op2_i ; 25 | 26 | // requant factor is unsigned 27 | assign op2_w = op2_i; 28 | 29 | 30 | 31 | assign unsigned_mul_w = op1_w * op2_w ; 32 | assign shift_mul_w = unsigned_mul_w[0+:OUTPUT_WD] ; 33 | 34 | assign signed_mul_w = (op1_i[INPUT_WD1 - 1] )? (~shift_mul_w +'d1) : shift_mul_w ; 35 | 36 | 37 | 38 | 39 | assign mul_o = signed_mul_w ; 40 | */ 41 | 42 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_relu_mul_pipe2.v: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | > File Name: pu_relu_mul_pipe2.v 3 | > Author: YuhengWei 4 | > Mail: 5 | > Created Time: Sun 6 Aug 2023 12:03:22 PM CST 6 | > Description: 7 | ************************************************************************/ 8 | 9 | module pu_relu_mul_pipe2 #( 10 | parameter RELU_IN_WD = 24 , 11 | parameter RELU_OUT_WD = 24 , 12 | parameter PE_COL_NUM = 32 , 13 | parameter RELU_PARAM_WD = 8 14 | )( 15 | 16 | input clk , 17 | input rstn , 18 | 19 | // 1h 4oc per cycles 20 | // oc_h 21 | input pu_relu_mul_p2_vld_i , 22 | output pu_relu_mul_p2_rdy_o , 23 | 24 | input [RELU_IN_WD * PE_COL_NUM -1: 0] conv_oc0_i , // one row of oc0 25 | input [RELU_IN_WD * PE_COL_NUM -1: 0] conv_oc1_i , // one row of oc1 26 | input [RELU_IN_WD * PE_COL_NUM -1: 0] conv_oc2_i , // one row of oc2 27 | input [RELU_IN_WD * PE_COL_NUM -1: 0] conv_oc3_i , // one row of oc3 28 | 29 | input [RELU_PARAM_WD -1: 0] relu_para_oc0_i , 30 | input [RELU_PARAM_WD -1: 0] relu_para_oc1_i , 31 | input [RELU_PARAM_WD -1: 0] relu_para_oc2_i , 32 | input [RELU_PARAM_WD -1: 0] relu_para_oc3_i , 33 | 34 | output pu_relu_mul_p2_vld_o , 35 | input pu_relu_mul_p2_rdy_i , 36 | 37 | output [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc0_o , 38 | output [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc1_o , 39 | output [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc2_o , 40 | output [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc3_o 41 | 42 | ); 43 | 44 | 45 | //----------------------------- 46 | 47 | // WIRE & REG 48 | 49 | // 50 | 51 | //----------------------------- 52 | reg vld_r ; 53 | 54 | reg [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc0_r ; 55 | reg [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc1_r ; 56 | reg [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc2_r ; 57 | reg [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc3_r ; 58 | 59 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc0_w ; 60 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc1_w ; 61 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc2_w ; 62 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_oc3_w ; 63 | 64 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_mul_oc0_w ; 65 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_mul_oc1_w ; 66 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_mul_oc2_w ; 67 | wire [RELU_OUT_WD * PE_COL_NUM -1: 0] prelu_mul_oc3_w ; 68 | 69 | 70 | 71 | 72 | 73 | genvar i; 74 | 75 | 76 | //---------------------------------------------------------------------------------------------------------- 77 | 78 | // PRELU TO ONE ROW OF OC0 79 | 80 | //---------------------------------------------------------------------------------------------------------- 81 | 82 | generate 83 | 84 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC0 85 | 86 | pu_mul #( 87 | .INPUT_WD1(RELU_IN_WD ), 88 | .INPUT_WD2(RELU_PARAM_WD ), 89 | .OUTPUT_WD(RELU_OUT_WD ) 90 | ) 91 | pu_relu_mul_oc0( 92 | .op1_i(conv_oc0_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD -: RELU_IN_WD] ) , 93 | .op2_i(relu_para_oc0_i ) , //fanout to 32 mul 94 | .mul_o(prelu_mul_oc0_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ) 95 | ); 96 | assign prelu_oc0_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] = conv_oc0_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD] ? 97 | prelu_mul_oc0_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] : 98 | conv_oc0_i[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ; 99 | 100 | end 101 | 102 | endgenerate 103 | 104 | //---------------------------------------------------------------------------------------------------------- 105 | 106 | // PRELU TO ONE ROW OF OC1 107 | 108 | //---------------------------------------------------------------------------------------------------------- 109 | 110 | generate 111 | 112 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC1 113 | 114 | pu_mul #( 115 | .INPUT_WD1(RELU_IN_WD ), 116 | .INPUT_WD2(RELU_PARAM_WD ), 117 | .OUTPUT_WD(RELU_OUT_WD ) 118 | ) 119 | pu_relu_mul_oc1( 120 | .op1_i(conv_oc1_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD -: RELU_IN_WD] ) , 121 | .op2_i(relu_para_oc1_i ) , //fanout to 32 mul 122 | .mul_o(prelu_mul_oc1_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ) 123 | ); 124 | assign prelu_oc1_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] = conv_oc1_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD] ? 125 | prelu_mul_oc1_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] : 126 | conv_oc1_i[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ; 127 | 128 | end 129 | 130 | endgenerate 131 | 132 | 133 | //---------------------------------------------------------------------------------------------------------- 134 | 135 | // PRELU TO ONE ROW OF OC2 136 | 137 | //---------------------------------------------------------------------------------------------------------- 138 | 139 | generate 140 | 141 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC2 142 | 143 | pu_mul #( 144 | .INPUT_WD1(RELU_IN_WD ), 145 | .INPUT_WD2(RELU_PARAM_WD ), 146 | .OUTPUT_WD(RELU_OUT_WD ) 147 | ) 148 | pu_relu_mul_oc2( 149 | .op1_i(conv_oc2_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD -: RELU_IN_WD] ) , 150 | .op2_i(relu_para_oc2_i ) , //fanout to 32 mul 151 | .mul_o(prelu_mul_oc2_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ) 152 | ); 153 | assign prelu_oc2_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] = conv_oc2_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD] ? 154 | prelu_mul_oc2_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] : 155 | conv_oc2_i[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ; 156 | 157 | end 158 | 159 | endgenerate 160 | 161 | 162 | //---------------------------------------------------------------------------------------------------------- 163 | 164 | // PRELU TO ONE ROW OF OC3 165 | 166 | //---------------------------------------------------------------------------------------------------------- 167 | 168 | generate 169 | 170 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC3 171 | 172 | pu_mul #( 173 | .INPUT_WD1(RELU_IN_WD ), 174 | .INPUT_WD2(RELU_PARAM_WD ), 175 | .OUTPUT_WD(RELU_OUT_WD ) 176 | ) 177 | pu_relu_mul_oc3( 178 | .op1_i(conv_oc3_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD -: RELU_IN_WD] ) , 179 | .op2_i(relu_para_oc3_i ) , //fanout to 32 mul 180 | .mul_o(prelu_mul_oc3_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ) 181 | ); 182 | assign prelu_oc3_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] = conv_oc3_i[PE_COL_NUM * RELU_IN_WD - 1 - i * RELU_IN_WD] ? 183 | prelu_mul_oc3_w[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] : 184 | conv_oc3_i[PE_COL_NUM * RELU_OUT_WD - 1 - i * RELU_OUT_WD -: RELU_OUT_WD] ; 185 | 186 | end 187 | 188 | endgenerate 189 | 190 | 191 | 192 | 193 | // bubble collapse 194 | 195 | assign pu_relu_mul_p2_rdy_o = ~vld_r | pu_relu_mul_p2_rdy_i ; 196 | 197 | always@(posedge clk or negedge rstn) begin 198 | if(~rstn)begin 199 | vld_r <= 'b0; 200 | end 201 | else if(~vld_r | pu_relu_mul_p2_rdy_i )begin 202 | vld_r <= pu_relu_mul_p2_vld_i ; 203 | end 204 | end 205 | 206 | always @(posedge clk) begin 207 | if(pu_relu_mul_p2_rdy_o && pu_relu_mul_p2_vld_i )begin 208 | prelu_oc0_r <= prelu_oc0_w ; 209 | prelu_oc1_r <= prelu_oc1_w ; 210 | prelu_oc2_r <= prelu_oc2_w ; 211 | prelu_oc3_r <= prelu_oc3_w ; 212 | end 213 | end 214 | 215 | 216 | assign pu_relu_mul_p2_vld_o = vld_r ; 217 | 218 | assign prelu_oc0_o = prelu_oc0_r ; 219 | assign prelu_oc1_o = prelu_oc1_r ; 220 | assign prelu_oc2_o = prelu_oc2_r ; 221 | assign prelu_oc3_o = prelu_oc3_r ; 222 | 223 | 224 | 225 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_requant_pipe4.v: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | > File Name: pu_requant_pipe4.v 3 | > Author: YuhengWei 4 | > Mail: 5 | > Created Time: Sun 6 Aug 2023 12:03:22 PM CST 6 | > Description: 7 | ************************************************************************/ 8 | 9 | 10 | // TODO: need multiplier 11 | module pu_requant_pipe4 #( 12 | parameter PE_OUTPUT_WD = 24 , 13 | parameter PE_COL_NUM = 32 , 14 | parameter REQUANT_PARM_WD = 8 , 15 | parameter REQUANT_WD = 8 16 | 17 | )( 18 | 19 | input clk , 20 | input rstn , 21 | 22 | // 1h 4oc per cycles 23 | // oc_h 24 | input pu_requant_p4_vld_i , 25 | output pu_requant_p4_rdy_o , 26 | 27 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] requant_oc0_i , // one row of oc0 28 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] requant_oc1_i , // one row of oc1 29 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] requant_oc2_i , // one row of oc2 30 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] requant_oc3_i , // one row of oc3 31 | 32 | input [REQUANT_PARM_WD -1: 0] parm_oc0_i , 33 | input [REQUANT_PARM_WD -1: 0] parm_oc1_i , 34 | input [REQUANT_PARM_WD -1: 0] parm_oc2_i , 35 | input [REQUANT_PARM_WD -1: 0] parm_oc3_i , 36 | 37 | output pu_requant_p4_vld_o , 38 | input pu_requant_p4_rdy_i , 39 | 40 | output [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc0_o , 41 | output [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc1_o , 42 | output [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc2_o , 43 | output [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc3_o 44 | 45 | ); 46 | 47 | 48 | //----------------------------- 49 | 50 | // WIRE & REG 51 | 52 | // 53 | 54 | //----------------------------- 55 | reg vld_r ; 56 | reg [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc0_r ; 57 | reg [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc1_r ; 58 | reg [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc2_r ; 59 | reg [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc3_r ; 60 | wire [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc0_w ; 61 | wire [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc1_w ; 62 | wire [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc2_w ; 63 | wire [REQUANT_WD * PE_COL_NUM -1: 0] requant_oc3_w ; 64 | 65 | 66 | 67 | 68 | 69 | genvar i; 70 | 71 | 72 | //---------------------------------------------------------------------------------------------------------- 73 | 74 | // REQUANT TO 8BIT FOR ONE ROW OF OC0 1 2 3 75 | 76 | // TODO: 77 | 78 | //---------------------------------------------------------------------------------------------------------- 79 | 80 | generate 81 | 82 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC0 83 | 84 | assign requant_oc0_w[PE_COL_NUM * REQUANT_WD - 1 - i * REQUANT_WD -: REQUANT_WD] = requant_oc0_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: REQUANT_WD] ; //reduce to 8bit 85 | assign requant_oc1_w[PE_COL_NUM * REQUANT_WD - 1 - i * REQUANT_WD -: REQUANT_WD] = requant_oc1_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: REQUANT_WD] ; //reduce to 8bit 86 | assign requant_oc2_w[PE_COL_NUM * REQUANT_WD - 1 - i * REQUANT_WD -: REQUANT_WD] = requant_oc2_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: REQUANT_WD] ; //reduce to 8bit 87 | assign requant_oc3_w[PE_COL_NUM * REQUANT_WD - 1 - i * REQUANT_WD -: REQUANT_WD] = requant_oc3_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: REQUANT_WD] ; //reduce to 8bit 88 | 89 | end 90 | 91 | endgenerate 92 | 93 | 94 | 95 | 96 | // bubble collapse 97 | 98 | assign pu_requant_p4_rdy_o = ~vld_r | pu_requant_p4_rdy_i ; 99 | 100 | always@(posedge clk or negedge rstn) begin 101 | if(~rstn)begin 102 | vld_r <= 'b0; 103 | end 104 | else if(~vld_r | pu_requant_p4_rdy_i )begin 105 | vld_r <= pu_requant_p4_vld_i ; 106 | end 107 | end 108 | 109 | always @(posedge clk) begin 110 | if(pu_requant_p4_rdy_o && pu_requant_p4_vld_i )begin 111 | requant_oc0_r <= requant_oc0_w ; 112 | requant_oc1_r <= requant_oc1_w ; 113 | requant_oc2_r <= requant_oc2_w ; 114 | requant_oc3_r <= requant_oc3_w ; 115 | end 116 | 117 | end 118 | 119 | 120 | assign pu_requant_p4_vld_o = vld_r ; 121 | 122 | assign requant_oc0_o = requant_oc0_r ; 123 | assign requant_oc1_o = requant_oc1_r ; 124 | assign requant_oc2_o = requant_oc2_r ; 125 | assign requant_oc3_o = requant_oc3_r ; 126 | 127 | 128 | endmodule -------------------------------------------------------------------------------- /rtl/pu/pu_resi_add_pipe_p3.v: -------------------------------------------------------------------------------- 1 | /************************************************************************* 2 | > File Name: pu_resi_add_pipe3.v 3 | > Author: YuhengWei 4 | > Mail: 5 | > Created Time: Sun 6 Aug 2023 12:03:22 PM CST 6 | > Description: 7 | ************************************************************************/ 8 | 9 | module pu_resi_add_pipe_p3 #( 10 | parameter PE_OUTPUT_WD = 8 , 11 | parameter PE_COL_NUM = 32 , 12 | parameter ACCUM_OUTPUT_WD = 9 , 13 | parameter RESI_WD = 8 , 14 | parameter X_N = PE_COL_NUM , 15 | parameter ACC_WD = ACCUM_OUTPUT_WD 16 | 17 | )( 18 | 19 | input clk , 20 | input rstn , 21 | 22 | // 1h 4oc per cycle 23 | // oc_h 24 | input pu_resi_add_p3_vld_i , 25 | output pu_resi_add_p3_rdy_o , 26 | input is_bypass_i , 27 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] prelu_0_i , // one row of oc0 28 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] prelu_1_i , // one row of oc1 29 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] prelu_2_i , // one row of oc2 30 | input [PE_OUTPUT_WD * PE_COL_NUM -1: 0] prelu_3_i , // one row of oc3 31 | 32 | input [RESI_WD * PE_COL_NUM -1: 0] resi_oc0_i , 33 | input [RESI_WD * PE_COL_NUM -1: 0] resi_oc1_i , 34 | input [RESI_WD * PE_COL_NUM -1: 0] resi_oc2_i , 35 | input [RESI_WD * PE_COL_NUM -1: 0] resi_oc3_i , 36 | 37 | output pu_resi_add_p3_vld_o , 38 | input pu_resi_add_p3_rdy_i , 39 | 40 | output [(ACC_WD + 2) * PE_COL_NUM -1: 0] resi_oc0_o , 41 | output [(ACC_WD + 2) * PE_COL_NUM -1: 0] resi_oc1_o , 42 | output [(ACC_WD + 2) * PE_COL_NUM -1: 0] resi_oc2_o , 43 | output [(ACC_WD + 2) * PE_COL_NUM -1: 0] resi_oc3_o 44 | 45 | ); 46 | 47 | 48 | //----------------------------- 49 | 50 | // WIRE & REG 51 | 52 | // 53 | 54 | //----------------------------- 55 | reg vld_r ; 56 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc0_r ; 57 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc1_r ; 58 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc2_r ; 59 | reg [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc3_r ; 60 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc0_w ; 61 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc1_w ; 62 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc2_w ; 63 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc3_w ; 64 | 65 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc0_mux_w ; 66 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc1_mux_w ; 67 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc2_mux_w ; 68 | wire [ACCUM_OUTPUT_WD * PE_COL_NUM -1: 0] resi_oc3_mux_w ; 69 | 70 | reg p0_vld_r ; 71 | wire p0_rdy_w ; 72 | wire p0_bc_rdy_w ; 73 | reg p1_vld_r ; 74 | wire p1_rdy_w ; 75 | wire p1_bc_rdy_w ; 76 | 77 | reg [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc0_r ; 78 | reg [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc1_r ; 79 | reg [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc2_r ; 80 | reg [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc3_r ; 81 | 82 | wire [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc0_w ; //11 bit 83 | wire [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc1_w ; 84 | wire [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc2_w ; 85 | wire [(ACC_WD + 2) * X_N -1: 0] resi_add_256_oc3_w ; 86 | 87 | genvar i; 88 | 89 | 90 | //---------------------------------------------------------------------------------------------------------- 91 | 92 | // ADD RESI TO ONE ROW OF OC0 93 | 94 | //---------------------------------------------------------------------------------------------------------- 95 | 96 | generate 97 | 98 | for(i = 0; i < PE_COL_NUM; i = i + 1 )begin:OC0 99 | 100 | pu_adder2 #( 101 | .INPUT_WD1(PE_OUTPUT_WD ), 102 | .INPUT_WD2(RESI_WD ), 103 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 104 | ) 105 | pu_adder_oc0( 106 | .op1_i(prelu_0_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 107 | .op2_i(resi_oc0_i[PE_COL_NUM * RESI_WD - 1 - i * RESI_WD -: RESI_WD] ) , 108 | .acc_o(resi_oc0_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 109 | ); 110 | 111 | end 112 | 113 | endgenerate 114 | 115 | //---------------------------------------------------------------------------------------------------------- 116 | 117 | // ADD RESI TO ONE ROW OF OC1 118 | 119 | //---------------------------------------------------------------------------------------------------------- 120 | 121 | generate 122 | 123 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC1 124 | 125 | pu_adder2 #( 126 | .INPUT_WD1(PE_OUTPUT_WD ), 127 | .INPUT_WD2(RESI_WD ), 128 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 129 | ) 130 | pu_adder_oc1( 131 | .op1_i(prelu_1_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 132 | .op2_i(resi_oc1_i[PE_COL_NUM * RESI_WD - 1 - i * RESI_WD -: RESI_WD] ) , 133 | .acc_o(resi_oc1_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 134 | ); 135 | 136 | end 137 | 138 | endgenerate 139 | 140 | //---------------------------------------------------------------------------------------------------------- 141 | 142 | // ADD RESI TO ONE ROW OF OC2 143 | 144 | //---------------------------------------------------------------------------------------------------------- 145 | 146 | generate 147 | 148 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC2 149 | 150 | pu_adder2 #( 151 | .INPUT_WD1(PE_OUTPUT_WD ), 152 | .INPUT_WD2(RESI_WD ), 153 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 154 | ) 155 | pu_adder_oc2( 156 | .op1_i(prelu_2_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 157 | .op2_i(resi_oc2_i[PE_COL_NUM * RESI_WD - 1 - i * RESI_WD -: RESI_WD] ) , 158 | .acc_o(resi_oc2_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 159 | ); 160 | 161 | end 162 | 163 | endgenerate 164 | 165 | //---------------------------------------------------------------------------------------------------------- 166 | 167 | // ADD RESI TO ONE ROW OF OC3 168 | 169 | //---------------------------------------------------------------------------------------------------------- 170 | 171 | generate 172 | 173 | for(i = 0; i < PE_COL_NUM; i = i + 1)begin:OC3 174 | 175 | pu_adder2 #( 176 | .INPUT_WD1(PE_OUTPUT_WD ), 177 | .INPUT_WD2(RESI_WD ), 178 | .OUTPUT_WD(ACCUM_OUTPUT_WD ) 179 | ) 180 | pu_adder_oc3( 181 | .op1_i(prelu_3_i[PE_COL_NUM * PE_OUTPUT_WD - 1 - i * PE_OUTPUT_WD -: PE_OUTPUT_WD] ) , 182 | .op2_i(resi_oc3_i[PE_COL_NUM * RESI_WD - 1 - i * RESI_WD -: RESI_WD] ) , 183 | .acc_o(resi_oc3_w[PE_COL_NUM * ACCUM_OUTPUT_WD - 1 - i * ACCUM_OUTPUT_WD -: ACCUM_OUTPUT_WD]) 184 | ); 185 | 186 | end 187 | 188 | endgenerate 189 | 190 | 191 | 192 | // bubble collapse 193 | 194 | wire pipe_vld ; 195 | wire pipe_rdy ; 196 | assign pipe_vld = pu_resi_add_p3_vld_i ; 197 | assign pu_resi_add_p3_rdy_o = pipe_rdy ; 198 | 199 | 200 | assign pipe_rdy = p0_bc_rdy_w ; 201 | assign p0_bc_rdy_w = ~p0_vld_r || p0_rdy_w ; 202 | 203 | always@(posedge clk or negedge rstn) begin 204 | if(~rstn)begin 205 | p0_vld_r <= 1'b0; 206 | end 207 | else if(p0_bc_rdy_w)begin 208 | p0_vld_r <= pipe_vld ; 209 | end 210 | end 211 | 212 | 213 | 214 | always @(posedge clk) begin 215 | if(pipe_vld && p0_bc_rdy_w )begin 216 | resi_oc0_r <= is_bypass_i ? prelu_0_i : resi_oc0_w ; 217 | resi_oc1_r <= is_bypass_i ? prelu_1_i : resi_oc1_w ; 218 | resi_oc2_r <= is_bypass_i ? prelu_2_i : resi_oc2_w ; 219 | resi_oc3_r <= is_bypass_i ? prelu_3_i : resi_oc3_w ; 220 | end 221 | end 222 | assign p0_rdy_w = p1_bc_rdy_w ; 223 | 224 | 225 | 226 | 227 | generate 228 | for(i = 0 ; i < 32 ; i = i + 1)begin : add256_c_0_3 229 | assign resi_add_256_oc0_w[X_N * (ACC_WD + 2) - 1 - i * (ACC_WD + 2) -: (ACC_WD + 2)] = $signed(resi_oc0_r[X_N * ACC_WD - 1 - i * ACC_WD -: ACC_WD]) + $signed(11'd256); 230 | assign resi_add_256_oc1_w[X_N * (ACC_WD + 2) - 1 - i * (ACC_WD + 2) -: (ACC_WD + 2)] = $signed(resi_oc1_r[X_N * ACC_WD - 1 - i * ACC_WD -: ACC_WD]) + $signed(11'd256); 231 | assign resi_add_256_oc2_w[X_N * (ACC_WD + 2) - 1 - i * (ACC_WD + 2) -: (ACC_WD + 2)] = $signed(resi_oc2_r[X_N * ACC_WD - 1 - i * ACC_WD -: ACC_WD]) + $signed(11'd256); 232 | assign resi_add_256_oc3_w[X_N * (ACC_WD + 2) - 1 - i * (ACC_WD + 2) -: (ACC_WD + 2)] = $signed(resi_oc3_r[X_N * ACC_WD - 1 - i * ACC_WD -: ACC_WD]) + $signed(11'd256); 233 | 234 | end 235 | endgenerate 236 | 237 | assign p1_bc_rdy_w = ~p1_vld_r || p1_rdy_w ; 238 | always @(posedge clk or negedge rstn)begin 239 | if(~rstn)begin 240 | p1_vld_r <= 1'b0; 241 | end 242 | else if(p1_bc_rdy_w)begin 243 | p1_vld_r <= p0_vld_r ; 244 | end 245 | end 246 | always @(posedge clk)begin 247 | if(p1_bc_rdy_w && p0_vld_r)begin 248 | resi_add_256_oc0_r <= is_bypass_i ? {{32{2'b0}}, resi_oc0_r} : resi_add_256_oc0_w ; 249 | resi_add_256_oc1_r <= is_bypass_i ? {{32{2'b0}}, resi_oc1_r} : resi_add_256_oc1_w ; 250 | resi_add_256_oc2_r <= is_bypass_i ? {{32{2'b0}}, resi_oc2_r} : resi_add_256_oc2_w ; 251 | resi_add_256_oc3_r <= is_bypass_i ? {{32{2'b0}}, resi_oc3_r} : resi_add_256_oc3_w ; 252 | end 253 | end 254 | assign p1_rdy_w = pu_resi_add_p3_rdy_i ; 255 | assign pu_resi_add_p3_vld_o = p1_vld_r ; 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | // 264 | assign resi_oc0_o = resi_add_256_oc0_r ; 265 | assign resi_oc1_o = resi_add_256_oc1_r ; 266 | assign resi_oc2_o = resi_add_256_oc2_r ; 267 | assign resi_oc3_o = resi_add_256_oc3_r ; 268 | 269 | 270 | endmodule -------------------------------------------------------------------------------- /rtl/sch/handshake_sche2pe.v: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////// 2 | // 3 | // File: handshake_sche2pe.v 4 | // Project Name: DLA_v2 5 | // Module Name: handshake_sche2pe 6 | // Description: handshake between scheduler and pe 7 | // 8 | // Author: Wanwei Xiao 9 | // Setup Data: 13/8/2023 10 | // Modify Date: 01/9/2023 11 | // 12 | ////////////////////////////////////////////////// 13 | module handshake_sche2pe 14 | #( 15 | parameter PE_COL_NUM = 32 , 16 | parameter PE_H_NUM = 4 , 17 | parameter PE_IC_NUM = 4 , 18 | parameter IFM_WIDTH = 8 , 19 | parameter WT_WIDTH = 8 20 | ) 21 | ( 22 | clk , 23 | rst_n , 24 | pe2sch_rdy , 25 | 26 | sch2pe_row_start_i , 27 | sch2pe_row_done_i , 28 | sch2pe_vld_i , 29 | mux_col_vld_i , 30 | mux_row_vld_i , 31 | mux_array_vld_i , 32 | 33 | sch_data_output_0_0_i, 34 | sch_data_output_0_1_i, 35 | sch_data_output_0_2_i, 36 | sch_data_output_0_3_i, 37 | sch_data_output_1_0_i, 38 | sch_data_output_1_1_i, 39 | sch_data_output_1_2_i, 40 | sch_data_output_1_3_i, 41 | sch_data_output_2_0_i, 42 | sch_data_output_2_1_i, 43 | sch_data_output_2_2_i, 44 | sch_data_output_2_3_i, 45 | sch_data_output_3_0_i, 46 | sch_data_output_3_1_i, 47 | sch_data_output_3_2_i, 48 | sch_data_output_3_3_i, 49 | 50 | sch_weight_output_0_0_i, 51 | sch_weight_output_0_1_i, 52 | sch_weight_output_0_2_i, 53 | sch_weight_output_0_3_i, 54 | sch_weight_output_1_0_i, 55 | sch_weight_output_1_1_i, 56 | sch_weight_output_1_2_i, 57 | sch_weight_output_1_3_i, 58 | sch_weight_output_2_0_i, 59 | sch_weight_output_2_1_i, 60 | sch_weight_output_2_2_i, 61 | sch_weight_output_2_3_i, 62 | sch_weight_output_3_0_i, 63 | sch_weight_output_3_1_i, 64 | sch_weight_output_3_2_i, 65 | sch_weight_output_3_3_i, 66 | 67 | sch2pe_row_start_o , 68 | sch2pe_row_done_o , 69 | sch2pe_vld_o , 70 | mux_col_vld_o , 71 | mux_row_vld_o , 72 | mux_array_vld_o , 73 | 74 | sch_data_output_0_0_o, 75 | sch_data_output_0_1_o, 76 | sch_data_output_0_2_o, 77 | sch_data_output_0_3_o, 78 | sch_data_output_1_0_o, 79 | sch_data_output_1_1_o, 80 | sch_data_output_1_2_o, 81 | sch_data_output_1_3_o, 82 | sch_data_output_2_0_o, 83 | sch_data_output_2_1_o, 84 | sch_data_output_2_2_o, 85 | sch_data_output_2_3_o, 86 | sch_data_output_3_0_o, 87 | sch_data_output_3_1_o, 88 | sch_data_output_3_2_o, 89 | sch_data_output_3_3_o, 90 | 91 | sch_weight_output_0_0_o, 92 | sch_weight_output_0_1_o, 93 | sch_weight_output_0_2_o, 94 | sch_weight_output_0_3_o, 95 | sch_weight_output_1_0_o, 96 | sch_weight_output_1_1_o, 97 | sch_weight_output_1_2_o, 98 | sch_weight_output_1_3_o, 99 | sch_weight_output_2_0_o, 100 | sch_weight_output_2_1_o, 101 | sch_weight_output_2_2_o, 102 | sch_weight_output_2_3_o, 103 | sch_weight_output_3_0_o, 104 | sch_weight_output_3_1_o, 105 | sch_weight_output_3_2_o, 106 | sch_weight_output_3_3_o 107 | ); 108 | 109 | input clk ; 110 | input rst_n ; 111 | input pe2sch_rdy ; 112 | 113 | input sch2pe_row_start_i; 114 | input sch2pe_row_done_i ; 115 | input sch2pe_vld_i ; 116 | input [PE_COL_NUM - 1 : 0] mux_col_vld_i ; 117 | input [PE_H_NUM - 1 : 0] mux_row_vld_i ; 118 | input [PE_IC_NUM - 1 : 0] mux_array_vld_i ; 119 | 120 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_0_i; 121 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_1_i; 122 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_2_i; 123 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_3_i; 124 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_0_i; 125 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_1_i; 126 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_2_i; 127 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_3_i; 128 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_0_i; 129 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_1_i; 130 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_2_i; 131 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_3_i; 132 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_0_i; 133 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_1_i; 134 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_2_i; 135 | input [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_3_i; 136 | 137 | input [WT_WIDTH - 1 : 0] sch_weight_output_0_0_i; 138 | input [WT_WIDTH - 1 : 0] sch_weight_output_0_1_i; 139 | input [WT_WIDTH - 1 : 0] sch_weight_output_0_2_i; 140 | input [WT_WIDTH - 1 : 0] sch_weight_output_0_3_i; 141 | input [WT_WIDTH - 1 : 0] sch_weight_output_1_0_i; 142 | input [WT_WIDTH - 1 : 0] sch_weight_output_1_1_i; 143 | input [WT_WIDTH - 1 : 0] sch_weight_output_1_2_i; 144 | input [WT_WIDTH - 1 : 0] sch_weight_output_1_3_i; 145 | input [WT_WIDTH - 1 : 0] sch_weight_output_2_0_i; 146 | input [WT_WIDTH - 1 : 0] sch_weight_output_2_1_i; 147 | input [WT_WIDTH - 1 : 0] sch_weight_output_2_2_i; 148 | input [WT_WIDTH - 1 : 0] sch_weight_output_2_3_i; 149 | input [WT_WIDTH - 1 : 0] sch_weight_output_3_0_i; 150 | input [WT_WIDTH - 1 : 0] sch_weight_output_3_1_i; 151 | input [WT_WIDTH - 1 : 0] sch_weight_output_3_2_i; 152 | input [WT_WIDTH - 1 : 0] sch_weight_output_3_3_i; 153 | 154 | output reg sch2pe_row_start_o; 155 | output reg sch2pe_row_done_o ; 156 | output reg sch2pe_vld_o ; 157 | output reg [PE_COL_NUM - 1 : 0] mux_col_vld_o ; 158 | output reg [PE_H_NUM - 1 : 0] mux_row_vld_o ; 159 | output reg [PE_IC_NUM - 1 : 0] mux_array_vld_o ; 160 | 161 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_0_o; 162 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_1_o; 163 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_2_o; 164 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_3_o; 165 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_0_o; 166 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_1_o; 167 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_2_o; 168 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_3_o; 169 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_0_o; 170 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_1_o; 171 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_2_o; 172 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_3_o; 173 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_0_o; 174 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_1_o; 175 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_2_o; 176 | output reg [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_3_o; 177 | 178 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_0_0_o; 179 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_0_1_o; 180 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_0_2_o; 181 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_0_3_o; 182 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_1_0_o; 183 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_1_1_o; 184 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_1_2_o; 185 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_1_3_o; 186 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_2_0_o; 187 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_2_1_o; 188 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_2_2_o; 189 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_2_3_o; 190 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_3_0_o; 191 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_3_1_o; 192 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_3_2_o; 193 | output reg [WT_WIDTH - 1 : 0] sch_weight_output_3_3_o; 194 | 195 | always@(posedge clk or negedge rst_n) 196 | begin 197 | if(!rst_n) begin 198 | sch2pe_row_start_o <= 0 ; 199 | //sch2pe_row_done_o <= 0 ; 200 | sch_data_output_0_0_o <= 0 ; 201 | sch_data_output_0_1_o <= 0 ; 202 | sch_data_output_0_2_o <= 0 ; 203 | sch_data_output_0_3_o <= 0 ; 204 | sch_data_output_1_0_o <= 0 ; 205 | sch_data_output_1_1_o <= 0 ; 206 | sch_data_output_1_2_o <= 0 ; 207 | sch_data_output_1_3_o <= 0 ; 208 | sch_data_output_2_0_o <= 0 ; 209 | sch_data_output_2_1_o <= 0 ; 210 | sch_data_output_2_2_o <= 0 ; 211 | sch_data_output_2_3_o <= 0 ; 212 | sch_data_output_3_0_o <= 0 ; 213 | sch_data_output_3_1_o <= 0 ; 214 | sch_data_output_3_2_o <= 0 ; 215 | sch_data_output_3_3_o <= 0 ; 216 | sch_weight_output_0_0_o <= 0 ; 217 | sch_weight_output_0_1_o <= 0 ; 218 | sch_weight_output_0_2_o <= 0 ; 219 | sch_weight_output_0_3_o <= 0 ; 220 | sch_weight_output_1_0_o <= 0 ; 221 | sch_weight_output_1_1_o <= 0 ; 222 | sch_weight_output_1_2_o <= 0 ; 223 | sch_weight_output_1_3_o <= 0 ; 224 | sch_weight_output_2_0_o <= 0 ; 225 | sch_weight_output_2_1_o <= 0 ; 226 | sch_weight_output_2_2_o <= 0 ; 227 | sch_weight_output_2_3_o <= 0 ; 228 | sch_weight_output_3_0_o <= 0 ; 229 | sch_weight_output_3_1_o <= 0 ; 230 | sch_weight_output_3_2_o <= 0 ; 231 | sch_weight_output_3_3_o <= 0 ; 232 | end 233 | else if(sch2pe_vld_i && pe2sch_rdy) begin 234 | sch2pe_row_start_o <= sch2pe_row_start_i ; 235 | //sch2pe_row_done_o <= sch2pe_row_done_i ; 236 | sch_data_output_0_0_o <= sch_data_output_0_0_i ; 237 | sch_data_output_0_1_o <= sch_data_output_0_1_i ; 238 | sch_data_output_0_2_o <= sch_data_output_0_2_i ; 239 | sch_data_output_0_3_o <= sch_data_output_0_3_i ; 240 | sch_data_output_1_0_o <= sch_data_output_1_0_i ; 241 | sch_data_output_1_1_o <= sch_data_output_1_1_i ; 242 | sch_data_output_1_2_o <= sch_data_output_1_2_i ; 243 | sch_data_output_1_3_o <= sch_data_output_1_3_i ; 244 | sch_data_output_2_0_o <= sch_data_output_2_0_i ; 245 | sch_data_output_2_1_o <= sch_data_output_2_1_i ; 246 | sch_data_output_2_2_o <= sch_data_output_2_2_i ; 247 | sch_data_output_2_3_o <= sch_data_output_2_3_i ; 248 | sch_data_output_3_0_o <= sch_data_output_3_0_i ; 249 | sch_data_output_3_1_o <= sch_data_output_3_1_i ; 250 | sch_data_output_3_2_o <= sch_data_output_3_2_i ; 251 | sch_data_output_3_3_o <= sch_data_output_3_3_i ; 252 | sch_weight_output_0_0_o <= sch_weight_output_0_0_i ; 253 | sch_weight_output_0_1_o <= sch_weight_output_0_1_i ; 254 | sch_weight_output_0_2_o <= sch_weight_output_0_2_i ; 255 | sch_weight_output_0_3_o <= sch_weight_output_0_3_i ; 256 | sch_weight_output_1_0_o <= sch_weight_output_1_0_i ; 257 | sch_weight_output_1_1_o <= sch_weight_output_1_1_i ; 258 | sch_weight_output_1_2_o <= sch_weight_output_1_2_i ; 259 | sch_weight_output_1_3_o <= sch_weight_output_1_3_i ; 260 | sch_weight_output_2_0_o <= sch_weight_output_2_0_i ; 261 | sch_weight_output_2_1_o <= sch_weight_output_2_1_i ; 262 | sch_weight_output_2_2_o <= sch_weight_output_2_2_i ; 263 | sch_weight_output_2_3_o <= sch_weight_output_2_3_i ; 264 | sch_weight_output_3_0_o <= sch_weight_output_3_0_i ; 265 | sch_weight_output_3_1_o <= sch_weight_output_3_1_i ; 266 | sch_weight_output_3_2_o <= sch_weight_output_3_2_i ; 267 | sch_weight_output_3_3_o <= sch_weight_output_3_3_i ; 268 | end 269 | end 270 | 271 | always @(posedge clk or negedge rst_n) 272 | begin 273 | if(!rst_n) 274 | sch2pe_row_done_o <= 0; 275 | else if(sch2pe_vld_i && pe2sch_rdy) 276 | sch2pe_row_done_o <= sch2pe_row_done_i; 277 | else 278 | sch2pe_row_done_o <= sch2pe_row_done_o && sch2pe_vld_i; 279 | end 280 | 281 | always @(posedge clk or negedge rst_n) 282 | begin 283 | if(!rst_n) begin 284 | sch2pe_vld_o <= 0 ; 285 | mux_col_vld_o <= 0 ; 286 | mux_row_vld_o <= 0 ; 287 | mux_array_vld_o <= 0 ; 288 | end 289 | else if(pe2sch_rdy) begin 290 | sch2pe_vld_o <= sch2pe_vld_i ; 291 | mux_col_vld_o <= mux_col_vld_i ; 292 | mux_row_vld_o <= mux_row_vld_i ; 293 | mux_array_vld_o <= mux_array_vld_i ; 294 | end 295 | end 296 | 297 | endmodule -------------------------------------------------------------------------------- /rtl/wt_buf.v: -------------------------------------------------------------------------------- 1 | /* 2 | Top Module: wt_buf.v 3 | Author: Hao Zhang 4 | Time: 202307 5 | */ 6 | 7 | module wt_buf#( 8 | parameter WT_WIDTH = 8 , 9 | parameter WT_ADDR_WIDTH = 7 , 10 | parameter WT_BUF0_DEPTH = 73 ,//DNDM 11 | parameter WT_BUF1_DEPTH = 108 ,//SR 12 | parameter IC_NUM = 4 , 13 | parameter OC_NUM = 4 , 14 | parameter WT_BUF_WIDTH = WT_WIDTH*IC_NUM*OC_NUM , 15 | parameter WT_GRP_NUM = 8 , 16 | parameter AXI2W_WIDTH = WT_BUF_WIDTH*WT_GRP_NUM , 17 | parameter KNOB_REGOUT = 0 18 | ) 19 | ( 20 | input wire clk , 21 | input wire rst_n , 22 | // control 23 | input wire buf_pp_flag , 24 | // axi 25 | input wire [ WT_ADDR_WIDTH - 1 : 0] axi2w_waddr , 26 | input wire axi2w_wen , 27 | input wire [ AXI2W_WIDTH - 1 : 0] axi2w_wdata , 28 | input wire [ WT_ADDR_WIDTH - 1 : 0] axi2w_raddr , 29 | input wire axi2w_ren , 30 | output wire [ AXI2W_WIDTH - 1 : 0] axi2w_rdata , 31 | // buf_rd 32 | input wire [ WT_GRP_NUM - 1 : 0] sch2w_ren , 33 | input wire [ WT_ADDR_WIDTH - 1 : 0] sch2w_raddr , 34 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_0_0 , 35 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_0_1 , 36 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_0_2 , 37 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_0_3 , 38 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_1_0 , 39 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_1_1 , 40 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_1_2 , 41 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_1_3 , 42 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_2_0 , 43 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_2_1 , 44 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_2_2 , 45 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_2_3 , 46 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_3_0 , 47 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_3_1 , 48 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_3_2 , 49 | output reg [ WT_WIDTH - 1 : 0] w2sch_rdata_3_3 50 | ); 51 | 52 | wire [ WT_ADDR_WIDTH - 1 : 0] wt0_waddr ; 53 | wire wt0_wen ; 54 | wire [ AXI2W_WIDTH - 1 : 0] wt0_wdata ; 55 | wire [ WT_ADDR_WIDTH - 1 : 0] wt0_raddr ; 56 | wire [ WT_GRP_NUM - 1 : 0] wt0_ren ; 57 | wire [ WT_BUF_WIDTH*WT_GRP_NUM - 1 : 0] wt0_rdata ; 58 | wire [ WT_ADDR_WIDTH - 1 : 0] wt1_waddr ; 59 | wire wt1_wen ; 60 | wire [ AXI2W_WIDTH - 1 : 0] wt1_wdata ; 61 | wire [ WT_ADDR_WIDTH - 1 : 0] wt1_raddr ; 62 | wire [ WT_GRP_NUM - 1 : 0] wt1_ren ; 63 | wire [ WT_BUF_WIDTH*WT_GRP_NUM - 1 : 0] wt1_rdata ; 64 | wire [ WT_BUF_WIDTH*WT_GRP_NUM - 1 : 0] w2sch_rdata_w; 65 | 66 | reg [ 8 - 1 : 0] sch2w_ren_d; 67 | 68 | genvar idx_inst; 69 | genvar idx_buf; 70 | 71 | // buffer_wr & buffer_rd 72 | generate 73 | for(idx_buf = 0; idx_buf < WT_GRP_NUM; idx_buf = idx_buf + 1)begin: wt_pp 74 | assign wt0_wdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] = axi2w_wdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH]; 75 | assign wt0_ren[idx_buf] = (buf_pp_flag == 0) ? axi2w_ren : sch2w_ren[idx_buf]; 76 | assign axi2w_rdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] = (buf_pp_flag == 0) ? wt0_rdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] : wt1_rdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH]; 77 | assign wt1_wdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] = axi2w_wdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH]; 78 | assign wt1_ren[idx_buf] = (buf_pp_flag == 1) ? axi2w_ren : sch2w_ren[idx_buf]; 79 | assign w2sch_rdata_w[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] = (buf_pp_flag == 1) ? wt0_rdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH] : wt1_rdata[(idx_buf+1)*WT_BUF_WIDTH - 1 : idx_buf*WT_BUF_WIDTH]; 80 | end 81 | endgenerate 82 | 83 | assign wt0_waddr = axi2w_waddr ; 84 | assign wt0_wen = (buf_pp_flag == 0) ? axi2w_wen : 0 ; 85 | assign wt0_raddr = (buf_pp_flag == 0) ? axi2w_raddr : sch2w_raddr ; 86 | assign wt1_waddr = axi2w_waddr ; 87 | assign wt1_wen = (buf_pp_flag == 1) ? axi2w_wen : 0 ; 88 | assign wt1_raddr = (buf_pp_flag == 1) ? axi2w_raddr : sch2w_raddr ; 89 | 90 | always@(posedge clk or negedge rst_n)begin 91 | if(!rst_n) 92 | sch2w_ren_d <= 0; 93 | else 94 | sch2w_ren_d <= sch2w_ren; 95 | end 96 | 97 | always@(*)begin 98 | case(sch2w_ren_d) 99 | 8'b00000001:begin 100 | w2sch_rdata_0_0 = w2sch_rdata_w[(0*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+0*WT_WIDTH]; 101 | w2sch_rdata_0_1 = w2sch_rdata_w[(0*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+1*WT_WIDTH]; 102 | w2sch_rdata_0_2 = w2sch_rdata_w[(0*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+2*WT_WIDTH]; 103 | w2sch_rdata_0_3 = w2sch_rdata_w[(0*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+3*WT_WIDTH]; 104 | w2sch_rdata_1_0 = w2sch_rdata_w[(0*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+4*WT_WIDTH]; 105 | w2sch_rdata_1_1 = w2sch_rdata_w[(0*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+5*WT_WIDTH]; 106 | w2sch_rdata_1_2 = w2sch_rdata_w[(0*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+6*WT_WIDTH]; 107 | w2sch_rdata_1_3 = w2sch_rdata_w[(0*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+7*WT_WIDTH]; 108 | w2sch_rdata_2_0 = w2sch_rdata_w[(0*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+8*WT_WIDTH]; 109 | w2sch_rdata_2_1 = w2sch_rdata_w[(0*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+9*WT_WIDTH]; 110 | w2sch_rdata_2_2 = w2sch_rdata_w[(0*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+10*WT_WIDTH]; 111 | w2sch_rdata_2_3 = w2sch_rdata_w[(0*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+11*WT_WIDTH]; 112 | w2sch_rdata_3_0 = w2sch_rdata_w[(0*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+12*WT_WIDTH]; 113 | w2sch_rdata_3_1 = w2sch_rdata_w[(0*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+13*WT_WIDTH]; 114 | w2sch_rdata_3_2 = w2sch_rdata_w[(0*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+14*WT_WIDTH]; 115 | w2sch_rdata_3_3 = w2sch_rdata_w[(0*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 0*WT_BUF_WIDTH+15*WT_WIDTH]; 116 | end 117 | 8'b00000010:begin 118 | w2sch_rdata_0_0 = w2sch_rdata_w[(1*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+0*WT_WIDTH]; 119 | w2sch_rdata_0_1 = w2sch_rdata_w[(1*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+1*WT_WIDTH]; 120 | w2sch_rdata_0_2 = w2sch_rdata_w[(1*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+2*WT_WIDTH]; 121 | w2sch_rdata_0_3 = w2sch_rdata_w[(1*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+3*WT_WIDTH]; 122 | w2sch_rdata_1_0 = w2sch_rdata_w[(1*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+4*WT_WIDTH]; 123 | w2sch_rdata_1_1 = w2sch_rdata_w[(1*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+5*WT_WIDTH]; 124 | w2sch_rdata_1_2 = w2sch_rdata_w[(1*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+6*WT_WIDTH]; 125 | w2sch_rdata_1_3 = w2sch_rdata_w[(1*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+7*WT_WIDTH]; 126 | w2sch_rdata_2_0 = w2sch_rdata_w[(1*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+8*WT_WIDTH]; 127 | w2sch_rdata_2_1 = w2sch_rdata_w[(1*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+9*WT_WIDTH]; 128 | w2sch_rdata_2_2 = w2sch_rdata_w[(1*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+10*WT_WIDTH]; 129 | w2sch_rdata_2_3 = w2sch_rdata_w[(1*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+11*WT_WIDTH]; 130 | w2sch_rdata_3_0 = w2sch_rdata_w[(1*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+12*WT_WIDTH]; 131 | w2sch_rdata_3_1 = w2sch_rdata_w[(1*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+13*WT_WIDTH]; 132 | w2sch_rdata_3_2 = w2sch_rdata_w[(1*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+14*WT_WIDTH]; 133 | w2sch_rdata_3_3 = w2sch_rdata_w[(1*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 1*WT_BUF_WIDTH+15*WT_WIDTH]; 134 | end 135 | 8'b00000100:begin 136 | w2sch_rdata_0_0 = w2sch_rdata_w[(2*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+0*WT_WIDTH]; 137 | w2sch_rdata_0_1 = w2sch_rdata_w[(2*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+1*WT_WIDTH]; 138 | w2sch_rdata_0_2 = w2sch_rdata_w[(2*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+2*WT_WIDTH]; 139 | w2sch_rdata_0_3 = w2sch_rdata_w[(2*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+3*WT_WIDTH]; 140 | w2sch_rdata_1_0 = w2sch_rdata_w[(2*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+4*WT_WIDTH]; 141 | w2sch_rdata_1_1 = w2sch_rdata_w[(2*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+5*WT_WIDTH]; 142 | w2sch_rdata_1_2 = w2sch_rdata_w[(2*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+6*WT_WIDTH]; 143 | w2sch_rdata_1_3 = w2sch_rdata_w[(2*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+7*WT_WIDTH]; 144 | w2sch_rdata_2_0 = w2sch_rdata_w[(2*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+8*WT_WIDTH]; 145 | w2sch_rdata_2_1 = w2sch_rdata_w[(2*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+9*WT_WIDTH]; 146 | w2sch_rdata_2_2 = w2sch_rdata_w[(2*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+10*WT_WIDTH]; 147 | w2sch_rdata_2_3 = w2sch_rdata_w[(2*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+11*WT_WIDTH]; 148 | w2sch_rdata_3_0 = w2sch_rdata_w[(2*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+12*WT_WIDTH]; 149 | w2sch_rdata_3_1 = w2sch_rdata_w[(2*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+13*WT_WIDTH]; 150 | w2sch_rdata_3_2 = w2sch_rdata_w[(2*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+14*WT_WIDTH]; 151 | w2sch_rdata_3_3 = w2sch_rdata_w[(2*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 2*WT_BUF_WIDTH+15*WT_WIDTH]; 152 | end 153 | 8'b00001000:begin 154 | w2sch_rdata_0_0 = w2sch_rdata_w[(3*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+0*WT_WIDTH]; 155 | w2sch_rdata_0_1 = w2sch_rdata_w[(3*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+1*WT_WIDTH]; 156 | w2sch_rdata_0_2 = w2sch_rdata_w[(3*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+2*WT_WIDTH]; 157 | w2sch_rdata_0_3 = w2sch_rdata_w[(3*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+3*WT_WIDTH]; 158 | w2sch_rdata_1_0 = w2sch_rdata_w[(3*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+4*WT_WIDTH]; 159 | w2sch_rdata_1_1 = w2sch_rdata_w[(3*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+5*WT_WIDTH]; 160 | w2sch_rdata_1_2 = w2sch_rdata_w[(3*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+6*WT_WIDTH]; 161 | w2sch_rdata_1_3 = w2sch_rdata_w[(3*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+7*WT_WIDTH]; 162 | w2sch_rdata_2_0 = w2sch_rdata_w[(3*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+8*WT_WIDTH]; 163 | w2sch_rdata_2_1 = w2sch_rdata_w[(3*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+9*WT_WIDTH]; 164 | w2sch_rdata_2_2 = w2sch_rdata_w[(3*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+10*WT_WIDTH]; 165 | w2sch_rdata_2_3 = w2sch_rdata_w[(3*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+11*WT_WIDTH]; 166 | w2sch_rdata_3_0 = w2sch_rdata_w[(3*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+12*WT_WIDTH]; 167 | w2sch_rdata_3_1 = w2sch_rdata_w[(3*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+13*WT_WIDTH]; 168 | w2sch_rdata_3_2 = w2sch_rdata_w[(3*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+14*WT_WIDTH]; 169 | w2sch_rdata_3_3 = w2sch_rdata_w[(3*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 3*WT_BUF_WIDTH+15*WT_WIDTH]; 170 | end 171 | 8'b00010000:begin 172 | w2sch_rdata_0_0 = w2sch_rdata_w[(4*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+0*WT_WIDTH]; 173 | w2sch_rdata_0_1 = w2sch_rdata_w[(4*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+1*WT_WIDTH]; 174 | w2sch_rdata_0_2 = w2sch_rdata_w[(4*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+2*WT_WIDTH]; 175 | w2sch_rdata_0_3 = w2sch_rdata_w[(4*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+3*WT_WIDTH]; 176 | w2sch_rdata_1_0 = w2sch_rdata_w[(4*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+4*WT_WIDTH]; 177 | w2sch_rdata_1_1 = w2sch_rdata_w[(4*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+5*WT_WIDTH]; 178 | w2sch_rdata_1_2 = w2sch_rdata_w[(4*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+6*WT_WIDTH]; 179 | w2sch_rdata_1_3 = w2sch_rdata_w[(4*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+7*WT_WIDTH]; 180 | w2sch_rdata_2_0 = w2sch_rdata_w[(4*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+8*WT_WIDTH]; 181 | w2sch_rdata_2_1 = w2sch_rdata_w[(4*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+9*WT_WIDTH]; 182 | w2sch_rdata_2_2 = w2sch_rdata_w[(4*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+10*WT_WIDTH]; 183 | w2sch_rdata_2_3 = w2sch_rdata_w[(4*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+11*WT_WIDTH]; 184 | w2sch_rdata_3_0 = w2sch_rdata_w[(4*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+12*WT_WIDTH]; 185 | w2sch_rdata_3_1 = w2sch_rdata_w[(4*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+13*WT_WIDTH]; 186 | w2sch_rdata_3_2 = w2sch_rdata_w[(4*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+14*WT_WIDTH]; 187 | w2sch_rdata_3_3 = w2sch_rdata_w[(4*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 4*WT_BUF_WIDTH+15*WT_WIDTH]; 188 | end 189 | 8'b00100000:begin 190 | w2sch_rdata_0_0 = w2sch_rdata_w[(5*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+0*WT_WIDTH]; 191 | w2sch_rdata_0_1 = w2sch_rdata_w[(5*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+1*WT_WIDTH]; 192 | w2sch_rdata_0_2 = w2sch_rdata_w[(5*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+2*WT_WIDTH]; 193 | w2sch_rdata_0_3 = w2sch_rdata_w[(5*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+3*WT_WIDTH]; 194 | w2sch_rdata_1_0 = w2sch_rdata_w[(5*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+4*WT_WIDTH]; 195 | w2sch_rdata_1_1 = w2sch_rdata_w[(5*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+5*WT_WIDTH]; 196 | w2sch_rdata_1_2 = w2sch_rdata_w[(5*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+6*WT_WIDTH]; 197 | w2sch_rdata_1_3 = w2sch_rdata_w[(5*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+7*WT_WIDTH]; 198 | w2sch_rdata_2_0 = w2sch_rdata_w[(5*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+8*WT_WIDTH]; 199 | w2sch_rdata_2_1 = w2sch_rdata_w[(5*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+9*WT_WIDTH]; 200 | w2sch_rdata_2_2 = w2sch_rdata_w[(5*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+10*WT_WIDTH]; 201 | w2sch_rdata_2_3 = w2sch_rdata_w[(5*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+11*WT_WIDTH]; 202 | w2sch_rdata_3_0 = w2sch_rdata_w[(5*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+12*WT_WIDTH]; 203 | w2sch_rdata_3_1 = w2sch_rdata_w[(5*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+13*WT_WIDTH]; 204 | w2sch_rdata_3_2 = w2sch_rdata_w[(5*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+14*WT_WIDTH]; 205 | w2sch_rdata_3_3 = w2sch_rdata_w[(5*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 5*WT_BUF_WIDTH+15*WT_WIDTH]; 206 | end 207 | 8'b01000000:begin 208 | w2sch_rdata_0_0 = w2sch_rdata_w[(6*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+0*WT_WIDTH]; 209 | w2sch_rdata_0_1 = w2sch_rdata_w[(6*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+1*WT_WIDTH]; 210 | w2sch_rdata_0_2 = w2sch_rdata_w[(6*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+2*WT_WIDTH]; 211 | w2sch_rdata_0_3 = w2sch_rdata_w[(6*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+3*WT_WIDTH]; 212 | w2sch_rdata_1_0 = w2sch_rdata_w[(6*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+4*WT_WIDTH]; 213 | w2sch_rdata_1_1 = w2sch_rdata_w[(6*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+5*WT_WIDTH]; 214 | w2sch_rdata_1_2 = w2sch_rdata_w[(6*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+6*WT_WIDTH]; 215 | w2sch_rdata_1_3 = w2sch_rdata_w[(6*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+7*WT_WIDTH]; 216 | w2sch_rdata_2_0 = w2sch_rdata_w[(6*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+8*WT_WIDTH]; 217 | w2sch_rdata_2_1 = w2sch_rdata_w[(6*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+9*WT_WIDTH]; 218 | w2sch_rdata_2_2 = w2sch_rdata_w[(6*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+10*WT_WIDTH]; 219 | w2sch_rdata_2_3 = w2sch_rdata_w[(6*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+11*WT_WIDTH]; 220 | w2sch_rdata_3_0 = w2sch_rdata_w[(6*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+12*WT_WIDTH]; 221 | w2sch_rdata_3_1 = w2sch_rdata_w[(6*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+13*WT_WIDTH]; 222 | w2sch_rdata_3_2 = w2sch_rdata_w[(6*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+14*WT_WIDTH]; 223 | w2sch_rdata_3_3 = w2sch_rdata_w[(6*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 6*WT_BUF_WIDTH+15*WT_WIDTH]; 224 | end 225 | 8'b10000000:begin 226 | w2sch_rdata_0_0 = w2sch_rdata_w[(7*WT_BUF_WIDTH+1*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+0*WT_WIDTH]; 227 | w2sch_rdata_0_1 = w2sch_rdata_w[(7*WT_BUF_WIDTH+2*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+1*WT_WIDTH]; 228 | w2sch_rdata_0_2 = w2sch_rdata_w[(7*WT_BUF_WIDTH+3*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+2*WT_WIDTH]; 229 | w2sch_rdata_0_3 = w2sch_rdata_w[(7*WT_BUF_WIDTH+4*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+3*WT_WIDTH]; 230 | w2sch_rdata_1_0 = w2sch_rdata_w[(7*WT_BUF_WIDTH+5*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+4*WT_WIDTH]; 231 | w2sch_rdata_1_1 = w2sch_rdata_w[(7*WT_BUF_WIDTH+6*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+5*WT_WIDTH]; 232 | w2sch_rdata_1_2 = w2sch_rdata_w[(7*WT_BUF_WIDTH+7*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+6*WT_WIDTH]; 233 | w2sch_rdata_1_3 = w2sch_rdata_w[(7*WT_BUF_WIDTH+8*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+7*WT_WIDTH]; 234 | w2sch_rdata_2_0 = w2sch_rdata_w[(7*WT_BUF_WIDTH+9*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+8*WT_WIDTH]; 235 | w2sch_rdata_2_1 = w2sch_rdata_w[(7*WT_BUF_WIDTH+10*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+9*WT_WIDTH]; 236 | w2sch_rdata_2_2 = w2sch_rdata_w[(7*WT_BUF_WIDTH+11*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+10*WT_WIDTH]; 237 | w2sch_rdata_2_3 = w2sch_rdata_w[(7*WT_BUF_WIDTH+12*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+11*WT_WIDTH]; 238 | w2sch_rdata_3_0 = w2sch_rdata_w[(7*WT_BUF_WIDTH+13*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+12*WT_WIDTH]; 239 | w2sch_rdata_3_1 = w2sch_rdata_w[(7*WT_BUF_WIDTH+14*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+13*WT_WIDTH]; 240 | w2sch_rdata_3_2 = w2sch_rdata_w[(7*WT_BUF_WIDTH+15*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+14*WT_WIDTH]; 241 | w2sch_rdata_3_3 = w2sch_rdata_w[(7*WT_BUF_WIDTH+16*WT_WIDTH) - 1 : 7*WT_BUF_WIDTH+15*WT_WIDTH]; 242 | end 243 | default:begin 244 | w2sch_rdata_0_0 = 0; 245 | w2sch_rdata_0_1 = 0; 246 | w2sch_rdata_0_2 = 0; 247 | w2sch_rdata_0_3 = 0; 248 | w2sch_rdata_1_0 = 0; 249 | w2sch_rdata_1_1 = 0; 250 | w2sch_rdata_1_2 = 0; 251 | w2sch_rdata_1_3 = 0; 252 | w2sch_rdata_2_0 = 0; 253 | w2sch_rdata_2_1 = 0; 254 | w2sch_rdata_2_2 = 0; 255 | w2sch_rdata_2_3 = 0; 256 | w2sch_rdata_3_0 = 0; 257 | w2sch_rdata_3_1 = 0; 258 | w2sch_rdata_3_2 = 0; 259 | w2sch_rdata_3_3 = 0; 260 | end 261 | endcase 262 | end 263 | 264 | // weight ping-pong buffer instantiation 265 | generate 266 | for(idx_inst = 0; idx_inst < WT_GRP_NUM; idx_inst = idx_inst + 1)begin: buf_inst 267 | dp_ram_regout #( 268 | .KNOB_REGOUT (KNOB_REGOUT), 269 | .ADDR_WIDTH (WT_ADDR_WIDTH), 270 | .DATA_WIDTH (WT_BUF_WIDTH), 271 | .DATA_DEPTH (WT_BUF0_DEPTH) 272 | ) 273 | u_wt0_buf( //DNDM 274 | .clk (clk), 275 | .wr_addr (wt0_waddr), 276 | .wr_en (wt0_wen), 277 | .wr_data (wt0_wdata[(idx_inst+1)*WT_BUF_WIDTH - 1 : idx_inst*WT_BUF_WIDTH]), 278 | .rd_addr (wt0_raddr), 279 | .rd_en (wt0_ren[idx_inst]), 280 | .rd_data (wt0_rdata[(idx_inst+1)*WT_BUF_WIDTH - 1 : idx_inst*WT_BUF_WIDTH]) 281 | ); 282 | dp_ram_regout #( //SR 283 | .KNOB_REGOUT (KNOB_REGOUT), 284 | .ADDR_WIDTH (WT_ADDR_WIDTH), 285 | .DATA_WIDTH (WT_BUF_WIDTH), 286 | .DATA_DEPTH (WT_BUF1_DEPTH) 287 | ) 288 | u_wt1_buf( 289 | .clk (clk), 290 | .wr_addr (wt1_waddr), 291 | .wr_en (wt1_wen), 292 | .wr_data (wt1_wdata[(idx_inst+1)*WT_BUF_WIDTH - 1 : idx_inst*WT_BUF_WIDTH]), 293 | .rd_addr (wt1_raddr), 294 | .rd_en (wt1_ren[idx_inst]), 295 | .rd_data (wt1_rdata[(idx_inst+1)*WT_BUF_WIDTH - 1 : idx_inst*WT_BUF_WIDTH]) 296 | ); 297 | end 298 | endgenerate 299 | 300 | endmodule -------------------------------------------------------------------------------- /sim/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openasic-org/xkDLA/bed44c45b0e9e4f0049bfef0bcc29a04522ca584/sim/.gitkeep -------------------------------------------------------------------------------- /sim/flist/filelist.f: -------------------------------------------------------------------------------- 1 | //top 2 | ../../rtl/top.v 3 | ../../rtl/ctrl_engine.v 4 | //scheduler 5 | ../../rtl/sch/scheduler.v 6 | ../../rtl/sch/addr_if.v 7 | ../../rtl/sch/sche_sub.v 8 | ../../rtl/sch/handshake_sche2pe.v 9 | //PE 10 | ../../rtl/pe_array/pe_array.v 11 | ../../rtl/pe_array/pe_ic.v 12 | ../../rtl/pe_array/pe2.v 13 | ../../rtl/pe_array/pe.v 14 | //PU 15 | ../../rtl/pu/pu_top.v 16 | ../../rtl/pu/pu_adder2.v 17 | ../../rtl/pu/pu_adder4.v 18 | ../../rtl/pu/pu_bias_add_pipe1.v 19 | ../../rtl/pu/pu_ic_add_pipe0.v 20 | ../../rtl/pu/pu_mul.v 21 | //../../rtl/pu/pu_relu_mul_pipe2.v 22 | //../../rtl/pu/pu_requant_pipe4.v 23 | ../../rtl/pu/pu_resi_add_pipe_p3.v 24 | ../../rtl/pu/pu_hbm_pipe.v 25 | ../../rtl/pu/pu_lbm_pipe.v 26 | //buf 27 | ../../rtl/dp_ram.v 28 | ../../rtl/dp_ram_regout.v 29 | ../../rtl/wt_buf.v 30 | ../../rtl/fe_buf.v 31 | ../../rtl/olp_buf.v 32 | ../../rtl/param_buf.v 33 | ../../rtl/res_buf.v 34 | //tb 35 | //../tb/tb_top.sv 36 | ../tb/tb_top_switch.sv 37 | //../tb/sub_bench/task.sv -------------------------------------------------------------------------------- /sim/tb/tb_addr_if.v: -------------------------------------------------------------------------------- 1 | `timescale 1ns/1ps 2 | module tb_addr_if; 3 | 4 | parameter IFM_WIDTH = 8; 5 | parameter SCH_COL_NUM = 40; 6 | parameter WT_WIDTH = 16; 7 | parameter PE_COL_NUM = 32; 8 | parameter PE_ROW_NUM = 4; 9 | parameter PE_IC_NUM = 4; 10 | parameter PE_OC_NUM = 4; 11 | parameter ADDR_WIDTH = 10; 12 | 13 | reg rstn; 14 | reg clk; 15 | // ctrl_i 16 | reg stack_switch; 17 | reg ctrl2sch_tile_start; 18 | reg pe2sch_rdy; 19 | reg [3:0] tile_loc; 20 | reg [3:0] ksize; 21 | reg [14:0] tile_in_h; 22 | reg [14:0] tile_out_h; 23 | reg [14:0] tile_in_w; 24 | reg [14:0] tile_out_w; 25 | reg [14:0] tile_in_c; 26 | reg [14:0] tile_out_c; 27 | reg [99:0] pu2sch_olp_addr; 28 | 29 | 30 | // rd addr 31 | wire [3:0] fe_olp_buf_rd_en; 32 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_0; 33 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_1; 34 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_2; 35 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_3; 36 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_0; 37 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_1; 38 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_2; 39 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_3; 40 | wire [7 : 0] wt_buf_rd_en; 41 | wire [ADDR_WIDTH - 1 : 0] wt_buf_rd_addr; 42 | 43 | wire row_done; 44 | wire sch2pe_vld; 45 | wire [PE_COL_NUM - 1 : 0] mux_col_vld; 46 | wire [PE_ROW_NUM - 1 : 0] mux_row_vld; 47 | wire [PE_IC_NUM - 1 : 0] mux_array_vld; 48 | wire [3 : 0] cnt_ksize_r; 49 | wire [2 : 0] cur_state_r; 50 | wire [2 : 0] addr_offset_r; 51 | 52 | 53 | 54 | initial begin 55 | clk =1'b0; 56 | forever #5 clk <= ~clk; 57 | end 58 | 59 | initial begin 60 | clk <= 1'b0; 61 | rstn <= 1'b1; 62 | #22 63 | rstn <= 1'b0; 64 | #17 65 | rstn <= 1'b1; 66 | #20 67 | stack_switch <= 0; 68 | ctrl2sch_tile_start <= 1; 69 | pe2sch_rdy <= 1; 70 | tile_loc <= 0001; 71 | ksize <= 3; 72 | tile_in_h <= 10; 73 | tile_out_h <= 9; 74 | tile_in_w <= 32; 75 | tile_out_w <= 32; 76 | tile_in_c <= 9; 77 | tile_out_c <= 8; 78 | pu2sch_olp_addr <= 0; 79 | #10 80 | ctrl2sch_tile_start <= 0; 81 | #2000 82 | ctrl2sch_tile_start <= 1; 83 | #10 84 | ctrl2sch_tile_start <= 0; 85 | #2000 86 | $finish; 87 | end 88 | 89 | // tile_loc == 0010; 90 | /* 91 | initial begin 92 | clk <= 1'b0; 93 | rstn <= 1'b1; 94 | #22 95 | rstn <= 1'b0; 96 | #17 97 | rstn <= 1'b1; 98 | #20 99 | stack_switch <= 0; 100 | ctrl2sch_tile_start <= 1; 101 | pe2sch_rdy <= 1; 102 | tile_loc <= 0010; 103 | ksize <= 3; 104 | tile_in_h <= 10; 105 | tile_out_h <= 9; 106 | tile_in_w <= 32; 107 | tile_out_w <= 32; 108 | tile_in_c <= 9; 109 | tile_out_c <= 8; 110 | pu2sch_olp_addr <= 0; 111 | #10 112 | ctrl2sch_tile_start <= 0; 113 | #2000 114 | ctrl2sch_tile_start <= 1; 115 | #10 116 | ctrl2sch_tile_start <= 0; 117 | #2000 118 | $finish; 119 | end*/ 120 | 121 | // tile_loc == 0000; 122 | /* 123 | initial begin 124 | clk <= 1'b0; 125 | rstn <= 1'b1; 126 | #22 127 | rstn <= 1'b0; 128 | #17 129 | rstn <= 1'b1; 130 | #20 131 | stack_switch <= 0; 132 | ctrl2sch_tile_start <= 1; 133 | pe2sch_rdy <= 1; 134 | tile_loc <= 0000; 135 | ksize <= 3; 136 | tile_in_h <= 10; 137 | tile_out_h <= 8; 138 | tile_in_w <= 32; 139 | tile_out_w <= 32; 140 | tile_in_c <= 8; 141 | tile_out_c <= 8; 142 | pu2sch_olp_addr <= 0; 143 | #10 144 | ctrl2sch_tile_start <= 0; 145 | #2000 146 | ctrl2sch_tile_start <= 1; 147 | #10 148 | ctrl2sch_tile_start <= 0; 149 | #2000 150 | $finish; 151 | end 152 | */ 153 | 154 | 155 | addr_if #( 156 | .IFM_WIDTH (8), 157 | .SCH_COL_NUM (40), 158 | .WT_WIDTH (16), 159 | .PE_COL_NUM (32), 160 | .PE_ROW_NUM (4), 161 | .PE_IC_NUM (4), 162 | .PE_OC_NUM (4), 163 | .ADDR_WIDTH (10) 164 | ) 165 | u0_addr_if 166 | ( 167 | .rstn (rstn), 168 | .clk (clk), 169 | 170 | // ctrl_i 171 | .stack_switch (stack_switch), 172 | .ctrl2sch_tile_start (ctrl2sch_tile_start), 173 | .pe2sch_rdy (pe2sch_rdy), 174 | .tile_loc (tile_loc), 175 | .ksize (ksize), 176 | .tile_in_h (tile_in_h), 177 | .tile_out_h (tile_out_h), 178 | .tile_in_w (tile_in_w), 179 | .tile_out_w (tile_out_w), 180 | .tile_in_c (tile_in_c), 181 | .tile_out_c (tile_out_c), 182 | .pu2sch_olp_addr (pu2sch_olp_addr), 183 | 184 | //buffer rd 185 | .fe_olp_buf_rd_en (fe_olp_buf_rd_en), 186 | .fe_buf_rd_addr_0 (fe_buf_rd_addr_0), 187 | .fe_buf_rd_addr_1 (fe_buf_rd_addr_1), 188 | .fe_buf_rd_addr_2 (fe_buf_rd_addr_2), 189 | .fe_buf_rd_addr_3 (fe_buf_rd_addr_3), 190 | .olp_buf_rd_addr_0 (olp_buf_rd_addr_0), 191 | .olp_buf_rd_addr_1 (olp_buf_rd_addr_1), 192 | .olp_buf_rd_addr_2 (olp_buf_rd_addr_2), 193 | .olp_buf_rd_addr_3 (olp_buf_rd_addr_3), 194 | .wt_buf_rd_en (wt_buf_rd_en), 195 | .wt_buf_rd_addr (wt_buf_rd_addr), 196 | 197 | .row_done (row_done), 198 | .sch2pe_vld (sch2pe_vld), 199 | .mux_col_vld (mux_col_vld), 200 | .mux_row_vld (mux_row_vld), 201 | .mux_array_vld (mux_array_vld), 202 | .cnt_ksize_r (cnt_ksize_r), 203 | .cur_state_r (cur_state_r), 204 | .addr_offset_r (addr_offset_r) 205 | ); 206 | 207 | `ifdef DUMP_VPD 208 | initial begin 209 | $display("Dump VPD wave!"); 210 | $vcdpluson(); 211 | end 212 | `endif 213 | 214 | initial begin 215 | $display("Dump fsdb wave!"); 216 | $fsdbDumpfile("tb.fsdb"); 217 | $fsdbDumpvars; 218 | end 219 | 220 | initial begin 221 | $display("\033[30;41m Hello error!\033[0m"); 222 | $display("\033[30;42m Hello pass!\033[0m"); 223 | $display("\033[30;43m Hello warning!\033[0m"); 224 | 225 | end 226 | 227 | `ifdef GLS_SIM 228 | initial begin 229 | $sdf_annotate("../../netlist_sim/sdf/TOP.sdf",tb.U_TOP,,"sdf.log","TYPICAL"); 230 | end 231 | `endif 232 | 233 | endmodule 234 | -------------------------------------------------------------------------------- /sim/tb/tb_ctrl_engine.sv: -------------------------------------------------------------------------------- 1 | `timescale 1ns/1ps 2 | `define PERIOD 8 3 | 4 | module tb_ctrl_engine; 5 | parameter REG_IFMH_WIDTH = 10 ; 6 | parameter REG_IFMW_WIDTH = 10 ; 7 | parameter REG_TILEH_WIDTH = 6 ; 8 | parameter REG_TNY_WIDTH = 6 ; 9 | parameter REG_TNX_WIDTH = 6 ; 10 | parameter REG_TLW_WIDTH = 6 ; 11 | parameter REG_TLH_WIDTH = 6 ; 12 | parameter TILE_BASE_W = 32 ; 13 | parameter REG_IH_WIDTH = 6 ; 14 | parameter REG_OH_WIDTH = 6 ; 15 | parameter REG_IW_WIDTH = 6 ; 16 | parameter REG_OW_WIDTH = 6 ; 17 | parameter REG_IC_WIDTH = 6 ; 18 | parameter REG_OC_WIDTH = 6 ; 19 | parameter REG_AF_WIDTH = 1 ; 20 | parameter REG_HBM_SFT_WIDTH = 6 ; 21 | parameter REG_LBM_SFT_WIDTH = 6 ; 22 | 23 | logic clk ; 24 | logic rst_n ; 25 | logic [ 32 - 1 : 0] ctrl_reg ; 26 | logic [ 32 - 1 : 0] state_reg ; 27 | logic [ 32 - 1 : 0] reg0 ; 28 | logic [ 32 - 1 : 0] reg1 ; 29 | logic layer_done ; 30 | logic layer_start ; 31 | logic [ 1 : 0] stat_ctrl ; 32 | logic [ 2 : 0] cnt_layer ; 33 | logic tile_switch_r ; 34 | logic model_switch_r ; 35 | logic tile_switch ; 36 | logic model_switch ; 37 | logic model_switch_layer ; 38 | logic nn_proc ; 39 | logic [ REG_TNX_WIDTH - 1 : 0] tile_tot_num_x ; 40 | logic [ REG_IH_WIDTH - 1 : 0] tile_in_h ; 41 | logic [ REG_OH_WIDTH - 1 : 0] tile_out_h ; 42 | logic [ REG_IW_WIDTH - 1 : 0] tile_in_w ; 43 | logic [ REG_OW_WIDTH - 1 : 0] tile_out_w ; 44 | logic [ REG_IC_WIDTH - 1 : 0] tile_in_c ; 45 | logic [ REG_OC_WIDTH - 1 : 0] tile_out_c ; 46 | logic [ 2 : 0] ksize ; 47 | logic [ 3 : 0] tile_loc ; 48 | logic x4_shuffle_vld ; 49 | logic [ REG_AF_WIDTH - 1 : 0] prl_vld ; 50 | logic [ 1 : 0] res_proc_type ; 51 | logic [ REG_HBM_SFT_WIDTH - 1 : 0] pu_hbm_shift ; 52 | logic [ REG_LBM_SFT_WIDTH - 1 : 0] pu_lbm_shift ; 53 | logic buf_pp_flag ; 54 | 55 | // logic moniter_done ; 56 | 57 | // event nxt_tile_event ; 58 | // event nxt_stack_event; 59 | // event nxt_reg_event; 60 | // event nxt_loading_event; 61 | // event nxt_wt_param_event; 62 | 63 | /******************************************************************************/ 64 | /************************************** DUT ***********************************/ 65 | /******************************************************************************/ 66 | ctrl_engine #( 67 | .REG_IFMH_WIDTH (REG_IFMH_WIDTH ), 68 | .REG_IFMW_WIDTH (REG_IFMW_WIDTH ), 69 | .REG_TILEH_WIDTH (REG_TILEH_WIDTH ), 70 | .REG_TNY_WIDTH (REG_TNY_WIDTH ), 71 | .REG_TNX_WIDTH (REG_TNX_WIDTH ), 72 | .REG_TLW_WIDTH (REG_TLW_WIDTH ), 73 | .REG_TLH_WIDTH (REG_TLH_WIDTH ), 74 | .TILE_BASE_W (TILE_BASE_W ), 75 | .REG_IH_WIDTH (REG_IH_WIDTH ), 76 | .REG_OH_WIDTH (REG_OH_WIDTH ), 77 | .REG_IW_WIDTH (REG_IW_WIDTH ), 78 | .REG_OW_WIDTH (REG_OW_WIDTH ), 79 | .REG_IC_WIDTH (REG_IC_WIDTH ), 80 | .REG_OC_WIDTH (REG_OC_WIDTH ), 81 | .REG_AF_WIDTH (REG_AF_WIDTH ), 82 | .REG_HBM_SFT_WIDTH (REG_HBM_SFT_WIDTH ), 83 | .REG_LBM_SFT_WIDTH (REG_LBM_SFT_WIDTH ) 84 | ) 85 | u_ctrl_engine ( 86 | .clk (clk ), 87 | .rst_n (rst_n ), 88 | .ctrl_reg (ctrl_reg ), 89 | .state_reg (state_reg ), 90 | .reg0 (reg0 ), 91 | .reg1 (reg1 ), 92 | .layer_done (layer_done ), 93 | .layer_start (layer_start ), 94 | .stat_ctrl (stat_ctrl ), 95 | .cnt_layer (cnt_layer ), 96 | .tile_switch_r (tile_switch_r ), 97 | .model_switch_r (model_switch_r ), 98 | .tile_switch (tile_switch ), 99 | .model_switch (model_switch ), 100 | .model_switch_layer (model_switch_layer ), 101 | .nn_proc (nn_proc ), 102 | .tile_tot_num_x (tile_tot_num_x ), 103 | .tile_in_h (tile_in_h ), 104 | .tile_out_h (tile_out_h ), 105 | .tile_in_w (tile_in_w ), 106 | .tile_out_w (tile_out_w ), 107 | .tile_in_c (tile_in_c ), 108 | .tile_out_c (tile_out_c ), 109 | .ksize (ksize ), 110 | .tile_loc (tile_loc ), 111 | .x4_shuffle_vld (x4_shuffle_vld ), 112 | .prl_vld (prl_vld ), 113 | .res_proc_type (res_proc_type ), 114 | .pu_hbm_shift (pu_hbm_shift ), 115 | .pu_lbm_shift (pu_lbm_shift ), 116 | .buf_pp_flag (buf_pp_flag ) 117 | ); 118 | 119 | /******************************************************************************/ 120 | /**************************** Clock Value Generation **************************/ 121 | /******************************************************************************/ 122 | initial begin 123 | clk = 1'b1; 124 | end 125 | 126 | always #(`PERIOD/2) clk = ~clk; 127 | 128 | /*******************************************************************************/ 129 | /******************************* Test Flow Generation **************************/ 130 | /*******************************************************************************/ 131 | initial begin 132 | system_rst_n(); 133 | wait_half_cycle(); 134 | set_reg(); 135 | end 136 | 137 | // finish 138 | initial begin 139 | wait(state_reg == 32'h00000001); 140 | #(`PERIOD*1000) $display("Simulation DONE!"); 141 | $finish; 142 | end 143 | 144 | initial begin 145 | #(`PERIOD*1000000) $display("Simulation Timeout!"); 146 | $finish; 147 | end 148 | 149 | // nxt_loading_event 150 | /* 151 | initial begin 152 | forever begin 153 | @(negedge u_top.tile_switch_r); 154 | ->nxt_tile_event; 155 | wait(u_top.u_fe_buf.layer_done && u_top.u_fe_buf.tile_switch_r); 156 | begin 157 | -> nxt_loading_event; 158 | end 159 | end 160 | end*/ 161 | // nxt_loading_event 162 | initial begin 163 | forever begin 164 | @(!rst_n) 165 | layer_done <= 0; 166 | end 167 | end 168 | 169 | initial begin 170 | forever begin 171 | @(posedge u_ctrl_engine.layer_start); 172 | wait_some_cycles(); 173 | layer_done <= 1; 174 | wait_one_cycle(); 175 | layer_done <= 0; 176 | end 177 | end 178 | 179 | /* 180 | initial begin 181 | #(`PERIOD*1010) -> nxt_loading_event; 182 | end*/ 183 | 184 | // initial begin 185 | // #(`PERIOD*30) -> nxt_loading_event; 186 | // end 187 | 188 | // //nxt_wt_param_event 189 | 190 | // initial begin 191 | // #(`PERIOD*40) -> nxt_wt_param_event; 192 | // end 193 | 194 | 195 | // // nxt_reg_event 196 | // initial begin 197 | // forever begin 198 | // @(posedge u_top.layer_done); 199 | // -> nxt_reg_event; 200 | // end 201 | // end 202 | 203 | // initial begin 204 | // #(`PERIOD*1000) -> nxt_reg_event; 205 | // end 206 | 207 | 208 | /******************************************************************************/ 209 | /********************************** moniter ***********************************/ 210 | /******************************************************************************/ 211 | // integer golden_buf; 212 | // integer golden_i; 213 | // integer golden_j; 214 | // reg [REG_IH_WIDTH : 0] fe_oh; 215 | // reg [REG_IC_WIDTH - 1 : 0] fe_oc; 216 | // reg [REG_OH_WIDTH - 1 : 0] golden_oh; 217 | // reg [REG_OC_WIDTH - 1 : 0] golden_oc; 218 | // reg [REG_OC_WIDTH - 1 : 0] num_oc; 219 | // reg [AXI2F_DATA_WIDTH - 1 : 0] axi2f_rdata_golden; 220 | // reg [AXI2F_DATA_WIDTH - 1 : 0] axi2f_rdata_golden_r; 221 | // reg [AXI2F_ADDR_WIDTH - 1 : 0] axi2f_raddr_r; 222 | // reg axi2f_ren_r; 223 | // reg moniter_done; 224 | // reg lst_tile_done_r; 225 | // reg lst_tile_done_r2; 226 | // wire lst_tile_done; 227 | // reg layer_done_r; 228 | // //reg [AXI2F_ADDR_WIDTH - 1 : 0] axi2f_raddr_golden; 229 | 230 | // always @(posedge clk or negedge rst_n) 231 | // begin 232 | // if(!rst_n) lst_tile_done_r <= 0; 233 | // else if(reg0 == 32'hffffffff && reg1 == 32'hffffffff && ctrl_reg == 32'h00000001) 234 | // lst_tile_done_r <= 1; 235 | // end 236 | 237 | // always @(posedge clk) lst_tile_done_r2 <= lst_tile_done_r; 238 | // always @(posedge clk) layer_done_r <= u_top.u_fe_buf.layer_done; 239 | 240 | // assign lst_tile_done = lst_tile_done_r2 ^ lst_tile_done_r; 241 | 242 | // initial begin 243 | // forever begin 244 | // wait((layer_done_r && u_top.u_ctrl_engine.tile_switch) || lst_tile_done) begin 245 | // golden_buf = $fopen(`GOLDEN_BUF_FILE ,"r" ); 246 | 247 | // $fscanf(golden_buf, "%d", fe_oc); 248 | // $fscanf(golden_buf, "%d", fe_oh); 249 | 250 | // for(golden_i = 0; golden_i < (((fe_oc + 3) >> 2) << 2); golden_i = golden_i + 1) begin 251 | // $fscanf(golden_buf, "%d", num_oc); 252 | // for(golden_j = 0; golden_j < ((fe_oh + 3) >> 2); golden_j = golden_j + 1) begin 253 | // wait_one_cycle(); 254 | // $fscanf(golden_buf, "%h", axi2f_rdata_golden[AXI2F_DATA_WIDTH - 1 : AXI2F_DATA_WIDTH - FE_BUF_WIDTH]); 255 | // $fscanf(golden_buf, "%h", axi2f_rdata_golden[AXI2F_DATA_WIDTH - FE_BUF_WIDTH - 1 : AXI2F_DATA_WIDTH - 2*FE_BUF_WIDTH]); 256 | // $fscanf(golden_buf, "%h", axi2f_rdata_golden[AXI2F_DATA_WIDTH - 2*FE_BUF_WIDTH - 1 : AXI2F_DATA_WIDTH - 3*FE_BUF_WIDTH]); 257 | // $fscanf(golden_buf, "%h", axi2f_rdata_golden[AXI2F_DATA_WIDTH - 3*FE_BUF_WIDTH - 1 : 0]); 258 | // axi2f_raddr[AXI2F_ADDR_WIDTH - 1 : AXI2F_ADDR_WIDTH - 2] = num_oc[1:0]; 259 | // axi2f_raddr[AXI2F_ADDR_WIDTH - 3 : 0] = num_oc[REG_IC_WIDTH - 1 : 2] * ((fe_oh + 3) >> 2) + golden_j; 260 | // axi2f_ren = 1; 261 | // end 262 | // end 263 | 264 | // wait_one_cycle(); 265 | // axi2f_ren = 0; 266 | // moniter_done = 1; 267 | // wait_one_cycle(); 268 | // moniter_done = 0; 269 | // end 270 | // end 271 | // end 272 | 273 | // initial begin 274 | // forever @(posedge clk) begin 275 | // axi2f_rdata_golden_r <= axi2f_rdata_golden; 276 | // axi2f_ren_r <= axi2f_ren; 277 | // axi2f_raddr_r <= axi2f_raddr; 278 | // end 279 | // end 280 | 281 | // initial begin 282 | // forever begin 283 | // @(posedge clk) begin 284 | // if(axi2f_ren_r == 1 && (axi2f_rdata_golden_r != axi2f_rdata)) begin 285 | // $display("\033[30;41m mismatch happened at time %0t\033[0m", $time); 286 | // $display("the mismatch in buffer %d", axi2f_raddr_r[AXI2F_ADDR_WIDTH - 1 : AXI2F_ADDR_WIDTH - 2]); 287 | // $display("the mismatch addr is %d", axi2f_raddr_r[AXI2F_ADDR_WIDTH - 3 : 0]); 288 | // //#(`PERIOD*100) $finish; 289 | // end 290 | // end 291 | // end 292 | // end 293 | 294 | /*******************************************************************************/ 295 | /********************** Task Definition in Testbench ***************************/ 296 | /*******************************************************************************/ 297 | //`include "../tb/sub_bench/task.sv" 298 | task wait_some_cycles(); 299 | #(`PERIOD*4); 300 | endtask 301 | 302 | task wait_one_cycle(); 303 | #(`PERIOD); 304 | endtask 305 | 306 | task wait_half_cycle(); 307 | #(`PERIOD/2); 308 | endtask 309 | 310 | task wait_quarter_cycle(); 311 | #(`PERIOD/4); 312 | endtask 313 | 314 | task system_rst_n(); 315 | wait_some_cycles(); 316 | rst_n <= 1; 317 | wait_some_cycles(); 318 | rst_n <= 0; 319 | wait_some_cycles(); 320 | rst_n <= 1; 321 | endtask 322 | 323 | task set_reg(); 324 | ctrl_reg <= 32'h00000002; 325 | wait_one_cycle(); 326 | ctrl_reg <= 32'h00000000; 327 | wait_some_cycles(); 328 | // reg0 <= 32'h0000a028; //40*40 329 | // reg1 <= 32'h082020a0; 330 | reg0 <= 32'h000873C0; //960*540 331 | reg1 <= 32'h1C01F460; 332 | wait_one_cycle(); 333 | ctrl_reg <= 32'h00000003; 334 | wait_one_cycle(); 335 | ctrl_reg <= 32'h00000000; 336 | endtask 337 | 338 | // task loading_fe_buf(); 339 | // //------------------------------------------------ 340 | // //ih(h) 341 | // //ic(h) 342 | // //num ic(h) 343 | // //ic0 fea0_0 data(256'h) 344 | // //ic0 fea0_1 data(256'h) 345 | // //ic0 fea0_2 data(256'h) 346 | // //ic0 fea0_3 data(256'h) 347 | // //... 348 | // //ic0 fea0_3 data(256'h) h/4 (fill 0 when h/4 != 0) 349 | // //num ic(h) 350 | // //ic1 fea1_0 data(256'h) 351 | // //... 352 | // //------------------------------------------------- 353 | // integer fe_buf; 354 | // integer fe_i; 355 | // integer fe_j; 356 | // reg [REG_IH_WIDTH : 0] fe_ih; 357 | // reg [REG_IC_WIDTH - 1 : 0] fe_ic; 358 | // reg [REG_IC_WIDTH - 1 : 0] num_ic; 359 | 360 | // fe_buf = $fopen( `FE_BUF_FILE ,"r" ); 361 | 362 | // forever begin 363 | // @(nxt_loading_event); 364 | 365 | // $fscanf(fe_buf, "%d", fe_ih); 366 | // $fscanf(fe_buf, "%d", fe_ic); 367 | 368 | // for(fe_i = 0; fe_i < (((fe_ic + 3) >> 2) << 2); fe_i = fe_i + 1) begin 369 | // $fscanf(fe_buf, "%d", num_ic); 370 | // for(fe_j = 0; fe_j < ((fe_ih + 3) >> 2); fe_j = fe_j + 1) begin 371 | // wait_one_cycle(); 372 | // $fscanf(fe_buf, "%h", axi2f_wdata[AXI2F_DATA_WIDTH - 1 : AXI2F_DATA_WIDTH - FE_BUF_WIDTH]); 373 | // $fscanf(fe_buf, "%h", axi2f_wdata[AXI2F_DATA_WIDTH - FE_BUF_WIDTH - 1 : AXI2F_DATA_WIDTH - 2*FE_BUF_WIDTH]); 374 | // $fscanf(fe_buf, "%h", axi2f_wdata[AXI2F_DATA_WIDTH - 2*FE_BUF_WIDTH - 1 : AXI2F_DATA_WIDTH - 3*FE_BUF_WIDTH]); 375 | // $fscanf(fe_buf, "%h", axi2f_wdata[AXI2F_DATA_WIDTH - 3*FE_BUF_WIDTH - 1 : 0]); 376 | // axi2f_waddr[AXI2F_ADDR_WIDTH - 1 : AXI2F_ADDR_WIDTH - 2] <= num_ic[1:0]; 377 | // axi2f_waddr[AXI2F_ADDR_WIDTH - 3 : 0] <= num_ic[REG_IC_WIDTH - 1 : 2] * ((fe_ih + 3) >> 2) + fe_j; 378 | // axi2f_wen = 1; 379 | // end 380 | // end 381 | 382 | // wait_one_cycle(); 383 | // axi2f_wen = 0; 384 | // end 385 | 386 | // $fclose(fe_buf); 387 | // endtask 388 | 389 | // task loading_wt_buf(); 390 | // //-------------------------------------------------------- 391 | // //the first line ceil(num of wt line) 392 | // //there are 16 wt_data every line, the data arrangement 393 | // //is ic0oc0, ic0oc1, ... , ic1oc0, ... , ic3oc3(8'h). 394 | // //fill 0 when ic or oc unvalid. 395 | // //the vertical sequence is ksize * ksize, ic, oc, h, layer 396 | // //-------------------------------------------------------- 397 | // integer wt_buf; 398 | // integer i, j, k; 399 | // reg [15 - 1 : 0] num_wt; 400 | // reg [6 - 1 : 0] num_layer; 401 | // reg [WT_BUF_WIDTH - 1 : 0] wt_data_0, wt_data_1, wt_data_2, wt_data_3, wt_data_4, wt_data_5, wt_data_6, wt_data_7; 402 | // reg [WT_BUF_WIDTH - 1 : 0] wt_data_0_r, wt_data_1_r, wt_data_2_r, wt_data_3_r, wt_data_4_r, wt_data_5_r, wt_data_6_r, wt_data_7_r; 403 | 404 | // wt_buf = $fopen(`WT_BUF_FILE, "r"); 405 | 406 | // forever begin 407 | // @(nxt_wt_param_event); 408 | 409 | // $fscanf(wt_buf, "%h", num_wt); 410 | 411 | // for(i = 0; i < ((num_wt + 7) >> 3); i = i + 1) begin 412 | // wait_one_cycle(); 413 | // $fscanf(wt_buf, "%h", wt_data_0); 414 | // $fscanf(wt_buf, "%h", wt_data_1); 415 | // $fscanf(wt_buf, "%h", wt_data_2); 416 | // $fscanf(wt_buf, "%h", wt_data_3); 417 | // $fscanf(wt_buf, "%h", wt_data_4); 418 | // $fscanf(wt_buf, "%h", wt_data_5); 419 | // $fscanf(wt_buf, "%h", wt_data_6); 420 | // $fscanf(wt_buf, "%h", wt_data_7); 421 | // for(k = 0; k < 16; k++) begin 422 | // wt_data_0_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_0[(15-k)*WT_WIDTH +:WT_WIDTH]; 423 | // wt_data_1_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_1[(15-k)*WT_WIDTH +:WT_WIDTH]; 424 | // wt_data_2_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_2[(15-k)*WT_WIDTH +:WT_WIDTH]; 425 | // wt_data_3_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_3[(15-k)*WT_WIDTH +:WT_WIDTH]; 426 | // wt_data_4_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_4[(15-k)*WT_WIDTH +:WT_WIDTH]; 427 | // wt_data_5_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_5[(15-k)*WT_WIDTH +:WT_WIDTH]; 428 | // wt_data_6_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_6[(15-k)*WT_WIDTH +:WT_WIDTH]; 429 | // wt_data_7_r[k*WT_WIDTH +:WT_WIDTH] = wt_data_7[(15-k)*WT_WIDTH +:WT_WIDTH]; 430 | // end 431 | // axi2w_wdata = {wt_data_0_r, wt_data_1_r, wt_data_2_r, wt_data_3_r, wt_data_4_r, wt_data_5_r, wt_data_6_r, wt_data_7_r}; 432 | // axi2w_waddr = i; 433 | // axi2w_wen = 1; 434 | // end 435 | 436 | // wait_one_cycle(); 437 | // axi2w_wen = 0; 438 | // end 439 | 440 | // $fclose(wt_buf); 441 | // endtask 442 | 443 | // task loading_param_buf(); 444 | // //--------------------------- 445 | // //ceil(oc/4)*4 446 | // //bias,LBM,HBM (16'h*3) h0,oc0 447 | // //bias,LBM,HBM (16'h*3) h0,oc1 448 | // //bias,LBM,HBM (16'h*3) h0,oc2 449 | // //bias,LBM,HBM (16'h*3) h0,oc3 450 | // //bias,LBM,HBM (16'h*3) h0,oc4 451 | // //... 452 | // //... 453 | // //ceil(oc/4)*4 next_layer 454 | // //... 455 | // //---------------------------- 456 | // integer param_buf; 457 | // integer i, j; 458 | // reg [6 - 1 : 0] num_layer; 459 | // reg [14:0] num_oc; 460 | 461 | // param_buf = $fopen(`PARAM_BUF_FILE, "r"); 462 | 463 | // forever begin 464 | // @(nxt_wt_param_event); 465 | 466 | // $fscanf(param_buf, "%h", num_layer); 467 | 468 | // for(j = 0; j < num_layer; j = j + 1) begin 469 | 470 | // $fscanf(param_buf, "%d", num_oc); 471 | 472 | // for(i = 0; i < ((num_oc + 3) >> 2); i = i + 1) begin 473 | // wait_one_cycle(); 474 | // $fscanf(param_buf, "%h", axi2p_wdata[BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH - 1 : 0]); 475 | // $fscanf(param_buf, "%h", axi2p_wdata[2*(BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH) - 1 : BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH]); 476 | // $fscanf(param_buf, "%h", axi2p_wdata[3*(BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH) - 1 : 2*(BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH)]); 477 | // $fscanf(param_buf, "%h", axi2p_wdata[4*(BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH) - 1 : 3*(BIAS_DATA_WIDTH+HBM_DATA_WIDTH+LBM_DATA_WIDTH)]); 478 | // axi2p_waddr = j * ((num_oc + 3) >> 2) + i; 479 | // axi2p_wen = 1; 480 | // end 481 | // end 482 | 483 | // wait_one_cycle(); 484 | // axi2p_wen = 0; 485 | // end 486 | 487 | // $fclose(param_buf); 488 | // endtask 489 | 490 | // task loading_reg(); 491 | // //------------------------- 492 | // //reg0(32'h) 493 | // //reg1(32'h) 494 | // //ctrl_reg(32'h) 495 | // //...(next layer) 496 | // //------------------------- 497 | // integer reg_file; 498 | // integer i; 499 | // reg [14:0] num_layer; 500 | 501 | // reg_file = $fopen(`REG_FILE, "r"); 502 | 503 | // forever begin 504 | // @(nxt_reg_event) 505 | // //for(i = 0; i < num_layer - 1; i = i + 1) begin 506 | // $fscanf(reg_file, "%h", reg0); 507 | // $fscanf(reg_file, "%h", reg1); 508 | // wait_one_cycle(); 509 | // $fscanf(reg_file, "%h", ctrl_reg); 510 | // //end 511 | // end 512 | 513 | // $fclose(reg_file); 514 | // endtask 515 | 516 | /*******************************************************************************/ 517 | /****************************** dump wave **************************************/ 518 | /*******************************************************************************/ 519 | `ifdef DUMP_VPD 520 | initial begin 521 | $display("Dump VPD wave!"); 522 | $vcdpluson(); 523 | end 524 | `endif 525 | 526 | initial begin 527 | $display("Dump fsdb wave!"); 528 | $fsdbDumpfile("tb.fsdb"); 529 | $fsdbDumpvars; 530 | end 531 | 532 | endmodule 533 | -------------------------------------------------------------------------------- /sim/tb/tb_ppp.sv: -------------------------------------------------------------------------------- 1 | `timescale 1ns/1ps 2 | 3 | 4 | 5 | 6 | 7 | module tb_ppp; 8 | 9 | parameter IMAGE_WIDTH = 'd1024; 10 | parameter IMGW_WIDTH = 'd11; 11 | parameter IMGH_WIDTH = 'd11; 12 | parameter ISP_DATA_WIDTH = 'd32 * 'd8 *'d3; 13 | parameter ISP_ADDR_WIDTH = 'd10; 14 | parameter DLA_ADDR_WIDTH = 'd10; 15 | parameter DLA_DATA_WIDTH = 'd32 * 'd8 * 'd4; 16 | parameter DATA_WIDTH = 'd32 * 'd8; 17 | parameter ADDR_WIDTH = 'd10; 18 | parameter DATA_DEPTH = 'd256; 19 | parameter CLK_FULL = 'd10; 20 | parameter CLK_HALF = 'd5; 21 | 22 | 23 | 24 | reg rst_n ; 25 | reg clk ; 26 | reg [IMGW_WIDTH -1: 0] img_width_i ; 27 | reg [IMGH_WIDTH -1: 0] img_height_i ; 28 | // 29 | reg top_start_i ; 30 | // isp - ppp interface 31 | reg isp_rchn_i ; 32 | reg isp_resp_i ; 33 | wire isp_rdy_o ; 34 | reg isp_done_i ; 35 | wire [ISP_DATA_WIDTH -1: 0] isp_rdata_o ; 36 | reg [ISP_ADDR_WIDTH -1: 0] isp_raddr_i ; 37 | reg isp_ren_i ; 38 | reg [ISP_DATA_WIDTH -1: 0] isp_wdata_i ; 39 | reg [ISP_ADDR_WIDTH -1: 0] isp_waddr_i ; 40 | reg isp_wen_i ; 41 | reg isp_wchn_i ; 42 | // dla - ppp interface 43 | reg dla_resp_i ; 44 | wire dla_rdy_o ; 45 | reg dla_done_i ; 46 | wire [DLA_DATA_WIDTH -1: 0] dla_rdata_o ; 47 | reg [DLA_ADDR_WIDTH -1: 0] dla_raddr_i ; 48 | reg dla_ren_i ; 49 | reg [DLA_DATA_WIDTH -1: 0] dla_wdata_i ; 50 | reg [DLA_ADDR_WIDTH -1: 0] dla_waddr_i ; 51 | reg dla_wen_i ; 52 | 53 | 54 | ppp_top #( 55 | .DLA_DATA_WIDTH (DLA_DATA_WIDTH), 56 | .DLA_ADDR_WIDTH (DLA_ADDR_WIDTH), 57 | .ISP_DATA_WIDTH (ISP_DATA_WIDTH), 58 | .ISP_ADDR_WIDTH (ISP_ADDR_WIDTH), 59 | .DATA_WIDTH (DATA_WIDTH), 60 | .ADDR_WIDTH (ADDR_WIDTH), 61 | .DATA_DEPTH (DATA_DEPTH) 62 | ) u_ppp_top( 63 | .clk (clk), 64 | .rst_n (rst_n), 65 | .img_width_i (img_width_i), 66 | .img_height_i (img_height_i), 67 | .top_start_i (top_start_i), 68 | .isp_resp_i (isp_resp_i), 69 | .isp_rdy_o (isp_rdy_o), 70 | .isp_done_i (isp_done_i), 71 | .isp_wdata_i (isp_wdata_i), 72 | .isp_wen_i (isp_wen_i), 73 | .isp_waddr_i (isp_waddr_i), 74 | .isp_wchn_i (isp_wchn_i), 75 | .isp_rdata_o (isp_rdata_o), 76 | .isp_ren_i (isp_ren_i), 77 | .isp_raddr_i (isp_raddr_i), 78 | .isp_rchn_i (isp_rchn_i), 79 | .dla_resp_i (dla_resp_i), 80 | .dla_rdy_o (dla_rdy_o), 81 | .dla_done_i (dla_done_i), 82 | .dla_wdata_i (dla_wdata_i), 83 | .dla_wen_i (dla_wen_i), 84 | .dla_waddr_i (dla_waddr_i), 85 | .dla_rdata_o (dla_rdata_o), 86 | .dla_ren_i (dla_ren_i), 87 | .dla_raddr_i (dla_raddr_i) 88 | ); 89 | 90 | event isp_write_event; 91 | 92 | initial begin 93 | ISP_WRITE; 94 | end 95 | 96 | task ISP_WRITE; 97 | integer tile_i; 98 | integer row_i; 99 | reg [768 -1: 0] data; 100 | reg [8 -1: 0] pix_dat; 101 | begin 102 | forever begin 103 | @(isp_write_event); 104 | for(tile_i = 0; tile_i < 32; tile_i = tile_i + 1) begin 105 | for(row_i = 0; row_i < 32; row_i = row_i + 1) begin 106 | pix_dat = tile_i[7:0]; 107 | data = {96{pix_dat}}; 108 | @(negedge clk); 109 | isp_wen_i = 1'b1; 110 | isp_wdata_i = data; 111 | isp_waddr_i = {row_i[4:0], tile_i[4:0]}; 112 | end 113 | end 114 | @(negedge clk); 115 | isp_wen_i = 1'b0; 116 | isp_done_i = 1'b1; 117 | @(negedge clk); 118 | isp_done_i = 1'b0; 119 | end 120 | end 121 | endtask 122 | 123 | event dla_read_event; 124 | 125 | initial begin 126 | DLA_READ; 127 | end 128 | 129 | task DLA_READ; 130 | integer tile_i; 131 | integer row_i; 132 | reg [1024 -1: 0] check_data; 133 | reg [8 -1: 0] pix_dat; 134 | begin 135 | forever begin 136 | @(dla_read_event); 137 | for(tile_i = 0; tile_i < 32; tile_i = tile_i + 1) begin 138 | for(row_i = 0; row_i < 8; row_i = row_i + 1) begin 139 | pix_dat = tile_i[7:0]; 140 | check_data = {32{pix_dat}}; 141 | @(negedge clk); 142 | dla_ren_i = 1'b1; 143 | dla_raddr_i = {2'b00,tile_i[4:0], row_i[2:0]}; 144 | check_data = {128{pix_dat}}; 145 | @(negedge clk); 146 | if(check_data != dla_rdata_o) begin 147 | $display("MISMATCH!\n"); 148 | $finish(); 149 | end 150 | end 151 | end 152 | @(negedge clk); 153 | dla_wen_i = 1'b0; 154 | dla_done_i = 1'b1; 155 | @(negedge clk); 156 | dla_done_i = 1'b0; 157 | end 158 | end 159 | endtask 160 | 161 | 162 | 163 | initial begin 164 | clk = 1'b0; 165 | forever #5 clk <= ~clk; 166 | end 167 | 168 | 169 | initial begin 170 | rst_n = 1'b0; 171 | #(CLK_FULL * 5) ; 172 | @(negedge clk); 173 | rst_n = 1'b1; 174 | end 175 | 176 | // data 177 | initial begin 178 | img_height_i = 'd32; 179 | img_width_i = 'd1024; 180 | isp_done_i = 'd0; 181 | dla_done_i = 'd0; 182 | isp_wen_i = 'd0; 183 | isp_ren_i = 'd0; 184 | isp_wchn_i = 'd1; 185 | isp_rchn_i = 'd1; 186 | dla_wen_i = 'd0; 187 | dla_ren_i = 'd0; 188 | #(CLK_FULL * 5) ; 189 | @(negedge clk); 190 | @(negedge clk); 191 | //start 192 | top_start_i = 'd1; 193 | @(negedge clk); 194 | top_start_i = 'd0; 195 | // ISP WRITE EVENT 196 | @(negedge clk); 197 | ->isp_write_event; 198 | @(posedge isp_done_i); 199 | // DLA READ EVENT 200 | @(negedge clk); 201 | ->dla_read_event; 202 | @(posedge dla_done_i); 203 | #(10 * CLK_FULL); 204 | $display("PASS !!!!!!!\n"); 205 | $finish(); 206 | end 207 | 208 | 209 | initial begin 210 | $display("Dump fsdb wave!"); 211 | $fsdbDumpfile("tb.fsdb"); 212 | $fsdbDumpvars; 213 | end 214 | 215 | initial begin 216 | $display("\033[30;41m Hello error!\033[0m"); 217 | $display("\033[30;42m Hello pass!\033[0m"); 218 | $display("\033[30;43m Hello warning!\033[0m"); 219 | 220 | end 221 | 222 | endmodule -------------------------------------------------------------------------------- /sim/tb/tb_scheduler.v: -------------------------------------------------------------------------------- 1 | `timescale 1ns/1ps 2 | module tb_sche_sub; 3 | 4 | parameter IFM_WIDTH = 8; 5 | parameter SCH_COL_NUM = 40; 6 | parameter WT_WIDTH = 16; 7 | parameter PE_COL_NUM = 32; 8 | parameter PE_ROW_NUM = 4; 9 | parameter PE_IC_NUM = 4; 10 | parameter PE_OC_NUM = 4; 11 | parameter ADDR_WIDTH = 10; 12 | 13 | reg clk; 14 | reg rstn; 15 | 16 | reg tile_switch; 17 | reg ctrl2sch_layer_start; 18 | reg [3 : 0] cnt_layer; 19 | reg [3 : 0] tile_loc; 20 | reg [3 : 0] ksize; 21 | reg pe2sch_rdy; 22 | reg [14 : 0] tile_in_h; 23 | reg [14 : 0] tile_out_h; 24 | reg [14 : 0] tile_in_w; 25 | reg [14 : 0] tile_out_w; 26 | reg [14 : 0] tile_in_c; 27 | reg [14 : 0] tile_out_c; 28 | reg [99 : 0] pu2sch_olp_addr; 29 | 30 | wire [3 : 0] fe_olp_buf_rd_en; 31 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_0; 32 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_1; 33 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_2; 34 | wire [ADDR_WIDTH - 1 : 0] fe_buf_rd_addr_3; 35 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_0; 36 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_1; 37 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_2; 38 | wire [ADDR_WIDTH - 1 : 0] olp_buf_rd_addr_3; 39 | wire [7 : 0] wt_buf_rd_en; 40 | wire [ADDR_WIDTH - 1 : 0] wt_buf_rd_addr; 41 | 42 | wire sch2pe_row_done; 43 | wire sch2pe_vld_o; 44 | wire [PE_COL_NUM - 1 : 0] mux_col_vld_o; 45 | wire [PE_ROW_NUM - 1 : 0] mux_row_vld_o; 46 | wire [PE_IC_NUM - 1 : 0] mux_array_vld_o; 47 | 48 | // interface with scheduler 49 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_0_0; 50 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_0_1; 51 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_0_2; 52 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_0_3; 53 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_1_0; 54 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_1_1; 55 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_1_2; 56 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_1_3; 57 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_2_0; 58 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_2_1; 59 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_2_2; 60 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_2_3; 61 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_3_0; 62 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_3_1; 63 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_3_2; 64 | reg [SCH_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_input_3_3; 65 | 66 | reg [WT_WIDTH - 1 : 0] sch_weight_input_0_0; 67 | reg [WT_WIDTH - 1 : 0] sch_weight_input_0_1; 68 | reg [WT_WIDTH - 1 : 0] sch_weight_input_0_2; 69 | reg [WT_WIDTH - 1 : 0] sch_weight_input_0_3; 70 | reg [WT_WIDTH - 1 : 0] sch_weight_input_1_0; 71 | reg [WT_WIDTH - 1 : 0] sch_weight_input_1_1; 72 | reg [WT_WIDTH - 1 : 0] sch_weight_input_1_2; 73 | reg [WT_WIDTH - 1 : 0] sch_weight_input_1_3; 74 | reg [WT_WIDTH - 1 : 0] sch_weight_input_2_0; 75 | reg [WT_WIDTH - 1 : 0] sch_weight_input_2_1; 76 | reg [WT_WIDTH - 1 : 0] sch_weight_input_2_2; 77 | reg [WT_WIDTH - 1 : 0] sch_weight_input_2_3; 78 | reg [WT_WIDTH - 1 : 0] sch_weight_input_3_0; 79 | reg [WT_WIDTH - 1 : 0] sch_weight_input_3_1; 80 | reg [WT_WIDTH - 1 : 0] sch_weight_input_3_2; 81 | reg [WT_WIDTH - 1 : 0] sch_weight_input_3_3; 82 | 83 | // dat_o 84 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_0; 85 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_1; 86 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_2; 87 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_0_3; 88 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_0; 89 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_1; 90 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_2; 91 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_1_3; 92 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_0; 93 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_1; 94 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_2; 95 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_2_3; 96 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_0; 97 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_1; 98 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_2; 99 | wire [PE_COL_NUM * IFM_WIDTH - 1 : 0] sch_data_output_3_3; 100 | 101 | wire [WT_WIDTH - 1 : 0] sch_weight_output_0_0; 102 | wire [WT_WIDTH - 1 : 0] sch_weight_output_0_1; 103 | wire [WT_WIDTH - 1 : 0] sch_weight_output_0_2; 104 | wire [WT_WIDTH - 1 : 0] sch_weight_output_0_3; 105 | wire [WT_WIDTH - 1 : 0] sch_weight_output_1_0; 106 | wire [WT_WIDTH - 1 : 0] sch_weight_output_1_1; 107 | wire [WT_WIDTH - 1 : 0] sch_weight_output_1_2; 108 | wire [WT_WIDTH - 1 : 0] sch_weight_output_1_3; 109 | wire [WT_WIDTH - 1 : 0] sch_weight_output_2_0; 110 | wire [WT_WIDTH - 1 : 0] sch_weight_output_2_1; 111 | wire [WT_WIDTH - 1 : 0] sch_weight_output_2_2; 112 | wire [WT_WIDTH - 1 : 0] sch_weight_output_2_3; 113 | wire [WT_WIDTH - 1 : 0] sch_weight_output_3_0; 114 | wire [WT_WIDTH - 1 : 0] sch_weight_output_3_1; 115 | wire [WT_WIDTH - 1 : 0] sch_weight_output_3_2; 116 | wire [WT_WIDTH - 1 : 0] sch_weight_output_3_3; 117 | 118 | wire [3:0] k; 119 | 120 | initial begin 121 | clk =1'b0; 122 | forever #5 clk <= ~clk; 123 | end 124 | /* 125 | initial begin 126 | clk <= 1'b0; 127 | rstn <= 1'b1; 128 | #22 129 | rstn <= 1'b0; 130 | #17 131 | rstn <= 1'b1; 132 | #20 133 | sch_data_input_0_0 <= 256'h01010101_01010101_01010101_01010101_01010101_01010101_01010101_01010203; 134 | sch_data_input_0_1 <= 256'h02020202_02020202_02020202_02020202_02020202_02020202_02020202_02010203; 135 | sch_data_input_0_2 <= 256'h03030303_03030303_03030303_03030303_03030303_03030303_03030303_03010203; 136 | sch_data_input_0_3 <= 256'h04040404_04040404_04040404_04040404_04040404_04040404_04040404_04010203; 137 | tile_switch <= 0; 138 | ctrl2sch_layer_start <= 1; 139 | pe2sch_rdy <= 1; 140 | tile_loc <= 0001; 141 | ksize <= 3; 142 | tile_in_h <= 10; 143 | tile_out_h <= 9; 144 | tile_in_w <= 32; 145 | tile_out_w <= 32; 146 | tile_in_c <= 9; 147 | tile_out_c <= 8; 148 | pu2sch_olp_addr <= 0; 149 | #10 150 | ctrl2sch_layer_start <= 0; 151 | #2000 152 | ctrl2sch_layer_start <= 1; 153 | #10 154 | ctrl2sch_layer_start <= 0; 155 | #3000 156 | $finish; 157 | end*/ 158 | 159 | // tile_loc == 0010; 160 | 161 | initial begin 162 | clk <= 1'b0; 163 | rstn <= 1'b1; 164 | #22 165 | rstn <= 1'b0; 166 | #17 167 | rstn <= 1'b1; 168 | #20 169 | tile_switch <= 0; 170 | ctrl2sch_layer_start <= 1; 171 | pe2sch_rdy <= 1; 172 | tile_loc <= 0010; 173 | ksize <= 3; 174 | tile_in_h <= 10; 175 | tile_out_h <= 9; 176 | tile_in_w <= 32; 177 | tile_out_w <= 32; 178 | tile_in_c <= 9; 179 | tile_out_c <= 8; 180 | pu2sch_olp_addr <= 0; 181 | rstn <= 1'b1; 182 | #22 183 | rstn <= 1'b0; 184 | #17 185 | rstn <= 1'b1; 186 | #10 187 | ctrl2sch_layer_start <= 0; 188 | #90 189 | pe2sch_rdy <= 0; 190 | #30 191 | pe2sch_rdy <= 1; 192 | #2000 193 | ctrl2sch_layer_start <= 1; 194 | #10 195 | ctrl2sch_layer_start <= 0; 196 | #2000 197 | $finish; 198 | end 199 | 200 | always @(posedge clk) 201 | begin 202 | sch_data_input_0_0 <= fe_olp_buf_rd_en[3] ? 256'h01010101_01010101_01010101_01010101_01010101_01010101_01010101_01010203 : 0; 203 | sch_data_input_0_1 <= fe_olp_buf_rd_en[2] ? 256'h02020202_02020202_02020202_02020202_02020202_02020202_02020202_02010203 : 0; 204 | sch_data_input_0_2 <= fe_olp_buf_rd_en[1] ? 256'h03030303_03030303_03030303_03030303_03030303_03030303_03030303_03010203 : 0; 205 | sch_data_input_0_3 <= fe_olp_buf_rd_en[0] ? 256'h04040404_04040404_04040404_04040404_04040404_04040404_04040404_04010203 : 0; 206 | end 207 | 208 | always @(posedge clk) 209 | begin 210 | sch_weight_input_0_0 <= wt_buf_rd_addr != 0 ? 32'h1234_5678 : 0; 211 | sch_weight_input_0_1 <= wt_buf_rd_addr != 0 ? 32'h8765_4321 : 0; 212 | sch_weight_input_0_2 <= wt_buf_rd_addr != 0 ? 32'h1234_5678 : 0; 213 | sch_weight_input_0_3 <= wt_buf_rd_addr != 0 ? 32'h8765_4321 : 0; 214 | end 215 | 216 | // tile_loc == 0000; 217 | /* 218 | initial begin 219 | clk <= 1'b0; 220 | rstn <= 1'b1; 221 | #22 222 | rstn <= 1'b0; 223 | #17 224 | rstn <= 1'b1; 225 | #20 226 | tile_switch <= 0; 227 | ctrl2sch_layer_start <= 1; 228 | pe2sch_rdy <= 1; 229 | tile_loc <= 0000; 230 | ksize <= 3; 231 | tile_in_h <= 10; 232 | tile_out_h <= 8; 233 | tile_in_w <= 32; 234 | tile_out_w <= 32; 235 | tile_in_c <= 8; 236 | tile_out_c <= 8; 237 | pu2sch_olp_addr <= 0; 238 | #10 239 | ctrl2sch_layer_start <= 0; 240 | #2000 241 | ctrl2sch_layer_start <= 1; 242 | #10 243 | ctrl2sch_layer_start <= 0; 244 | #2000 245 | $finish; 246 | end 247 | */ 248 | 249 | scheduler #( 250 | .IFM_WIDTH (IFM_WIDTH), 251 | .SCH_COL_NUM (SCH_COL_NUM), 252 | .WT_WIDTH (WT_WIDTH), 253 | .PE_COL_NUM (PE_COL_NUM), 254 | .PE_ROW_NUM (PE_ROW_NUM), 255 | .PE_IC_NUM (PE_IC_NUM), 256 | .PE_OC_NUM (PE_OC_NUM), 257 | .ADDR_WIDTH (ADDR_WIDTH) 258 | ) 259 | u0_scheduler 260 | ( 261 | .clk(clk), 262 | .rstn(rstn), 263 | 264 | // ctrl_i 265 | .tile_switch (tile_switch), 266 | .ctrl2sch_layer_start (ctrl2sch_layer_start), 267 | .cnt_layer (cnt_layer), 268 | .pe2sch_rdy (pe2sch_rdy), 269 | .tile_loc (tile_loc), 270 | .ksize (ksize), 271 | .tile_in_h (tile_in_h), 272 | .tile_out_h (tile_out_h), 273 | .tile_in_w (tile_in_w), 274 | .tile_out_w (tile_out_w), 275 | .tile_in_c (tile_in_c), 276 | .tile_out_c (tile_out_c), 277 | .pu2sch_olp_addr (pu2sch_olp_addr), 278 | 279 | //buffer rd 280 | .fe_olp_buf_rd_en (fe_olp_buf_rd_en), 281 | .fe_buf_rd_addr_0 (fe_buf_rd_addr_0), 282 | .fe_buf_rd_addr_1 (fe_buf_rd_addr_1), 283 | .fe_buf_rd_addr_2 (fe_buf_rd_addr_2), 284 | .fe_buf_rd_addr_3 (fe_buf_rd_addr_3), 285 | .olp_buf_rd_addr_0 (olp_buf_rd_addr_0), 286 | .olp_buf_rd_addr_1 (olp_buf_rd_addr_1), 287 | .olp_buf_rd_addr_2 (olp_buf_rd_addr_2), 288 | .olp_buf_rd_addr_3 (olp_buf_rd_addr_3), 289 | .wt_buf_rd_en (wt_buf_rd_en), 290 | .wt_buf_rd_addr (wt_buf_rd_addr), 291 | 292 | .sch2pe_row_done(sch2pe_row_done), 293 | .sch2pe_vld_o(sch2pe_vld_o), 294 | .mux_col_vld_o(mux_col_vld_o), 295 | .mux_row_vld_o(mux_row_vld_o), 296 | .mux_array_vld_o(mux_array_vld_o), 297 | 298 | .sch_data_input_0_0(sch_data_input_0_0), 299 | .sch_data_input_0_1(sch_data_input_0_1), 300 | .sch_data_input_0_2(sch_data_input_0_2), 301 | .sch_data_input_0_3(sch_data_input_0_3), 302 | .sch_data_input_1_0(sch_data_input_1_0), 303 | .sch_data_input_1_1(sch_data_input_1_1), 304 | .sch_data_input_1_2(sch_data_input_1_2), 305 | .sch_data_input_1_3(sch_data_input_1_3), 306 | .sch_data_input_2_0(sch_data_input_2_0), 307 | .sch_data_input_2_1(sch_data_input_2_1), 308 | .sch_data_input_2_2(sch_data_input_2_2), 309 | .sch_data_input_2_3(sch_data_input_2_3), 310 | .sch_data_input_3_0(sch_data_input_3_0), 311 | .sch_data_input_3_1(sch_data_input_3_1), 312 | .sch_data_input_3_2(sch_data_input_3_2), 313 | .sch_data_input_3_3(sch_data_input_3_3), 314 | 315 | .sch_weight_input_0_0(sch_weight_input_0_0), 316 | .sch_weight_input_0_1(sch_weight_input_0_1), 317 | .sch_weight_input_0_2(sch_weight_input_0_2), 318 | .sch_weight_input_0_3(sch_weight_input_0_3), 319 | .sch_weight_input_1_0(sch_weight_input_1_0), 320 | .sch_weight_input_1_1(sch_weight_input_1_1), 321 | .sch_weight_input_1_2(sch_weight_input_1_2), 322 | .sch_weight_input_1_3(sch_weight_input_1_3), 323 | .sch_weight_input_2_0(sch_weight_input_2_0), 324 | .sch_weight_input_2_1(sch_weight_input_2_1), 325 | .sch_weight_input_2_2(sch_weight_input_2_2), 326 | .sch_weight_input_2_3(sch_weight_input_2_3), 327 | .sch_weight_input_3_0(sch_weight_input_3_0), 328 | .sch_weight_input_3_1(sch_weight_input_3_1), 329 | .sch_weight_input_3_2(sch_weight_input_3_2), 330 | .sch_weight_input_3_3(sch_weight_input_3_3), 331 | 332 | .sch_data_output_0_0(sch_data_output_0_0), 333 | .sch_data_output_0_1(sch_data_output_0_1), 334 | .sch_data_output_0_2(sch_data_output_0_2), 335 | .sch_data_output_0_3(sch_data_output_0_3), 336 | .sch_data_output_1_0(sch_data_output_1_0), 337 | .sch_data_output_1_1(sch_data_output_1_1), 338 | .sch_data_output_1_2(sch_data_output_1_2), 339 | .sch_data_output_1_3(sch_data_output_1_3), 340 | .sch_data_output_2_0(sch_data_output_2_0), 341 | .sch_data_output_2_1(sch_data_output_2_1), 342 | .sch_data_output_2_2(sch_data_output_2_2), 343 | .sch_data_output_2_3(sch_data_output_2_3), 344 | .sch_data_output_3_0(sch_data_output_3_0), 345 | .sch_data_output_3_1(sch_data_output_3_1), 346 | .sch_data_output_3_2(sch_data_output_3_2), 347 | .sch_data_output_3_3(sch_data_output_3_3), 348 | 349 | .sch_weight_output_0_0(sch_weight_output_0_0), 350 | .sch_weight_output_0_1(sch_weight_output_0_1), 351 | .sch_weight_output_0_2(sch_weight_output_0_2), 352 | .sch_weight_output_0_3(sch_weight_output_0_3), 353 | .sch_weight_output_1_0(sch_weight_output_1_0), 354 | .sch_weight_output_1_1(sch_weight_output_1_1), 355 | .sch_weight_output_1_2(sch_weight_output_1_2), 356 | .sch_weight_output_1_3(sch_weight_output_1_3), 357 | .sch_weight_output_2_0(sch_weight_output_2_0), 358 | .sch_weight_output_2_1(sch_weight_output_2_1), 359 | .sch_weight_output_2_2(sch_weight_output_2_2), 360 | .sch_weight_output_2_3(sch_weight_output_2_3), 361 | .sch_weight_output_3_0(sch_weight_output_3_0), 362 | .sch_weight_output_3_1(sch_weight_output_3_1), 363 | .sch_weight_output_3_2(sch_weight_output_3_2), 364 | .sch_weight_output_3_3(sch_weight_output_3_3) 365 | ); 366 | 367 | `ifdef DUMP_VPD 368 | initial begin 369 | $display("Dump VPD wave!"); 370 | $vcdpluson(); 371 | end 372 | `endif 373 | 374 | initial begin 375 | $display("Dump fsdb wave!"); 376 | $fsdbDumpfile("tb.fsdb"); 377 | $fsdbDumpvars; 378 | end 379 | 380 | initial begin 381 | $display("\033[30;41m Hello error!\033[0m"); 382 | $display("\033[30;42m Hello pass!\033[0m"); 383 | $display("\033[30;43m Hello warning!\033[0m"); 384 | 385 | end 386 | 387 | `ifdef GLS_SIM 388 | initial begin 389 | $sdf_annotate("../../netlist_sim/sdf/TOP.sdf",tb.U_TOP,,"sdf.log","TYPICAL"); 390 | end 391 | `endif 392 | 393 | endmodule 394 | -------------------------------------------------------------------------------- /sim/tv/dndm/param_buf.txt: -------------------------------------------------------------------------------- 1 | 05 2 | 10 3 | 7fff8ce994c5 4 | 7fff8ce994c5 5 | 7fff8ce994c5 6 | 7fff8ce994c5 7 | 48248ce994c5 8 | f2618ce994c5 9 | 7fff8ce994c5 10 | 80008ce994c5 11 | 80008ce994c5 12 | 80008ce994c5 13 | 80008ce994c5 14 | 7fff8ce994c5 15 | 80008ce994c5 16 | 80008ce994c5 17 | 7fff8ce994c5 18 | 7eac8ce994c5 19 | 10 20 | 1820886d94c5 21 | 19a4886d94c5 22 | 4268886d94c5 23 | 6f3f886d94c5 24 | 320d886d94c5 25 | 457c886d94c5 26 | 2f8d886d94c5 27 | 7fff886d94c5 28 | 19bd886d94c5 29 | 515b886d94c5 30 | 6c25886d94c5 31 | 3d66886d94c5 32 | 7426886d94c5 33 | 4038886d94c5 34 | 1323886d94c5 35 | 546d886d94c5 36 | 10 37 | 33a8b44c94c5 38 | 10f8b44c94c5 39 | 5148b44c94c5 40 | 22bfb44c94c5 41 | fa07b44c94c5 42 | 22e1b44c94c5 43 | 32d6b44c94c5 44 | 3a11b44c94c5 45 | 156db44c94c5 46 | 3411b44c94c5 47 | 4732b44c94c5 48 | 3797b44c94c5 49 | fe26b44c94c5 50 | 23bfb44c94c5 51 | 2772b44c94c5 52 | 2542b44c94c5 53 | 10 54 | 4087aa3794c5 55 | 3ca3aa3794c5 56 | 3980aa3794c5 57 | 0000aa3794c5 58 | 243daa3794c5 59 | 239caa3794c5 60 | 1831aa3794c5 61 | 5f55aa3794c5 62 | 3dfcaa3794c5 63 | 2aa2aa3794c5 64 | 2e63aa3794c5 65 | 3189aa3794c5 66 | 464baa3794c5 67 | 20f8aa3794c5 68 | 2398aa3794c5 69 | 1ae7aa3794c5 70 | 03 71 | 7ffffd2094c5 72 | 6131fd2094c5 73 | 7ffffd2094c5 74 | -------------------------------------------------------------------------------- /sim/tv/dndm/wt_buf.txt: -------------------------------------------------------------------------------- 1 | 278 2 | e3d0fff4f8f7f9fd0629111f00000000 3 | e1041122fe0afde1161e01e600000000 4 | 1fe51d02f90df5db3ff92c2d00000000 5 | f9f31dfffae50ae8390c0c0400000000 6 | edc604f70b05db0df911313d00000000 7 | f0d8182bfd04edf62823d91400000000 8 | 2aecfc580d10f5fc0232190900000000 9 | 25cd37e517edd5f32c1fdd0900000000 10 | ef050f452bff22e1340627ef00000000 11 | 03f11fc5f91ee81d0a23e1f700000000 12 | e6e205ebf52c01ef1d130a3b00000000 13 | feef15211105d70e440b18ed00000000 14 | 25072ee5253020153135086000000000 15 | d4eaff04f02af6142e3202fa00000000 16 | fbe50a06fe0ef8003a02144600000000 17 | faf80ae2d01cf4fa3d17011600000000 18 | fef8fe400e1de6031a2005e800000000 19 | eef418f12b1b2ada482826cf00000000 20 | 13dbd923110608fc281ef0df00000000 21 | 19fe1e1f0c1a0580370ff0ec00000000 22 | 28a5fbfb010b0ceff434dd3600000000 23 | 18e1f517292211cd301a091200000000 24 | 0ef511dd0a21060c2319f04300000000 25 | e5e0020806ff1a322b0e2e1100000000 26 | 1f0f0131e305e4df0101f60600000000 27 | 34ef2af216f2f70f08f50ad700000000 28 | e9ff0d0d11f4e9961f191ce800000000 29 | ee1e2614331714f7150f2bf100000000 30 | f91d130013f2002401fce41c00000000 31 | ddf60c05edf201e807fc07f700000000 32 | 1a10fcfff3f2ecf9feecfc0f00000000 33 | fe1cf1eb20fa1ee6f7f7f5dc00000000 34 | 0b0a1cf3f003010ffef6110c00000000 35 | 0c2bf0edf730eee5f4eb091f00000000 36 | fdff02efda1202f906e6060300000000 37 | e5e707bee02006cee80d0fde00000000 38 | fdd6001311140baf33ec2c1c00000000 39 | 0efb1a3d00dd0f2bf83106ea00000000 40 | 07040c29d6011b3528110b0600000000 41 | ec02f8081e1ce9e9ec0bd9b500000000 42 | 04f7f6120207f6e4caf2f9f500000000 43 | 090300f902e224fa001506e000000000 44 | d3ede9fd21023d55fdfa0b0100000000 45 | fdfae5da0bdcf7f512fd235000000000 46 | f8f8f4fbf2ede603e010270b00000000 47 | 0e0e04c31bf4122505f20d0e00000000 48 | cf3001e0fd01f3c503f9f60a00000000 49 | 310704230bfdf6d4041d19f500000000 50 | 200df5f3f2f9fd1d0f0ffcf700000000 51 | 01f40406dfe9f1fa16e5fef200000000 52 | f33bffffdfe20be1efe1f4e600000000 53 | 11c4121019144ffc03c8daef00000000 54 | f3222c28000ba701ebc91ef600000000 55 | f3184fe506201deeececd10400000000 56 | d51d021ff2efdb0619ce17e700000000 57 | 060ee715fdbf50f0eff1e30400000000 58 | f414db4d1f070d20f80840d800000000 59 | 0a0cfd32e5c30e0ad3dae3e800000000 60 | 1fdfd53ad0035c2afde1fe1300000000 61 | 0af9ff0ef1dfc4f4e9eb24bb00000000 62 | f751f137fe0208120af7181400000000 63 | 021ed73fc9f6ad10efe9e00800000000 64 | f84ec84f2be5bc0916dedffc00000000 65 | da19031ce769e210c60d0cf900000000 66 | 093af913ece0040f15d8e22500000000 67 | f311ee49095d110df8dfe5db00000000 68 | 08f2eb2131f8942c190cb6e600000000 69 | f322b829cc21c305c302d92e00000000 70 | fe01074020c51ef41102fecf00000000 71 | 23fadb00080bf8fef2fe59ed00000000 72 | 190aec0cfb173011f8b81dd500000000 73 | e6e8d84cdcc0e7fffec8f0dc00000000 74 | 0529f1181afd0b07ffbf0b2200000000 75 | edfd092be2f8f80d1208d2fc00000000 76 | 091320211dfe12f603e90f2600000000 77 | cef02113f9f8e9f30af0e1fc00000000 78 | f5ffcd24fdc720fae4e0da2100000000 79 | c4f0f42bc3e406f50bea040700000000 80 | 04d21bfef5eb16142bfa0fea00000000 81 | c7de0b211a290928ffe7070800000000 82 | 01ec170000d205f51119da2000000000 83 | 1fff0f2de2f3f7ffe0e5ebe000000000 84 | dd1218fb5545541707fef5f800000000 85 | 0009180eed094affe6f6ff0600000000 86 | f6081f081a3026daf7dbd8f700000000 87 | ebe10d12f4d418ea4e030a1800000000 88 | e8f012032ee11aef0de5040d00000000 89 | c50b2e21b41321fc4f26091800000000 90 | 0e0df6edcbd02510f2ecfae000000000 91 | ddf605f4150bf2f4d63315f300000000 92 | f2f8fefafed90a0d09ec0d0000000000 93 | 1d12f3e8dee9f90a071e2c0200000000 94 | 1ed61408e10020cdfaf8dcd600000000 95 | f3142717e6e50effee12fbf600000000 96 | e5f207ed08ec31ef04dbd4f200000000 97 | ded90419c81107fff2cc0b0f00000000 98 | 191ae8131e4a31f60b0adc0e00000000 99 | f1001d16ebe1f701f22ef30800000000 100 | cd0eda04c70827011eeceef200000000 101 | e7e30a09f51ee40dc9fe0c1c00000000 102 | 04fd0005020302fdfe00fe04f6fd03f9 103 | 010704fe0300fdfbff01fafdfefafbfe 104 | fa0200fdfe04fd000004f9fffbfafffb 105 | 03040103020200fe0105ff03050307ff 106 | 71fffffd036cfcff05fe7103fe03027f 107 | fe08010204fe000608f9010906020001 108 | fe06fe03020201f9fdfafd01fa04ff00 109 | fc030201fffefa0000fc010209080803 110 | 0205fcff01fefffb030000fcf90500fe 111 | 00fd01fdffff01fe06fb00ff0003fe11 112 | fffc050305fd03fb07f70002050c0e04 113 | fefb010101fc06ff00fbfe00fb0301fb 114 | fe02020400fa01fefd01fb0607030001 115 | fefe0303fefffe04ff000303060d0b02 116 | 05fff9fffffe0204fe0401fff3000303 117 | 03ff04fefffffdfc01fffe00fc02fc0c 118 | 02feff0307ffff02fe0302fb000d0803 119 | fffc000100040602fe030001f40103fe 120 | f207fe020a02fefffa070201fafdfd03 121 | f3fff8fc09020803fdfa06fc02fdff02 122 | 0003fff705090306f301f407fdff0303 123 | fc07f60109fb01fcf6fc01fc010101fe 124 | f6fe00030002ff00edf5fffe0cfc0004 125 | fa03f9020d060302f7f60301fffcfcfb 126 | f701fcfc08f600fef7070600fffffd05 127 | f7fdfe0108f301fdf0f8fb0802fdfd02 128 | fbfd030208f90204e9f80217fd00fd05 129 | fe00faff0202fe06f9f7fcfcf9fa0305 130 | 03f501fe010300fe03fdfefe04fd0404 131 | 00fffd01010c0b01fafcf9fd01fc0201 132 | 060003000205f7ff05fcfef902f60704 133 | fcff05010907060706fb01fdfdfbfd05 134 | 03fbfffa02050605fe04030000fd0301 135 | fbfcfc0700fef9fffbff01fefff80102 136 | 02fa01000dfffd0301040203fcfe0103 137 | 01fa000302070c0102fffdfa01fbff00 138 | 00ff0201000203fef6fefefdfb0004fa 139 | fe0104ff01fdfefb01ff00fb010602f1 140 | fdfe080003fbfb030200fffdfdfdfffb 141 | 01fdfdfe0501fb04fb03010005ff0008 142 | 00fdfc02fa030301030001ff02000500 143 | fafe05fdfb02faff0401fd05070501ff 144 | 0104ff02ff020003ff02fe0002000204 145 | 02010005ff0005fe00ff010106fb0201 146 | 03fdfffdfd02ff01fe01fefdff010108 147 | 0707fe05fe02fe03fe00fe00ff010106 148 | fefbfb01fd0300000203010007fffe1b 149 | 00000200fd0101f701ff040103fc0103 150 | fd020304030400fbfffffa000c00fd01 151 | 6d020404ff7100fefe0272ff07fd017b 152 | fafbfefefc0000fa03fdfc0205ff00fd 153 | 040404060202ff00ff00feff01000003 154 | 02020005fe010004fbfd00fd0202040a 155 | 01fbfeff0500fcfdfefcfd01fffc0908 156 | 03fefc030204000401fff80502010303 157 | fa00fcfc05fd030cff0000fcfeff02fd 158 | 0103fffe02fcff0dfb00f8f0fff9ff00 159 | 0001fafe0802fa08f5fb07fffcff06fd 160 | 03ff04020501fa13fafc01eb04fdfd00 161 | fcfffcff03fbfb0df90006f5fa020101 162 | fdff01080704f9fafeff00fefd07fc02 163 | ff04fefffbfefdfff6fe0b010403f902 164 | 03020403ff050004fd01fce600f8ff01 165 | 0402fc0101020309f801fef9fd0001ff 166 | fd050600fc030603fbfc04070402fe03 167 | ff00fcfe0300080f0000fe0200050105 168 | 05030007fc040204fc0302080601ff00 169 | 030600fb0503020b05020303ffff0101 170 | 0102010501fefb0701fc05ff00fe0104 171 | fefe04070102fe08fffe01fcfffffeff 172 | fbff020306fe02fa0302f803fefefd03 173 | 0800fb0200000409fe0100010401ff06 174 | fcfffe05fcfe00fcfd0102fbf9fc05f0 175 | 000106fffffb00fffffa0003010306f2 176 | fdfa0a00fdfd0301fffd0101fbff06fc 177 | fd010301fa06f801f8fb02f90001fefd 178 | 00fd0101fa0101feff02fa040002fdfe 179 | fc04080202f9fefef90302050101fffb 180 | 04fb01fa01fc010001feff03fdfffe00 181 | 02fc0000f7fffff905ff0302fd00fe02 182 | fc0205fc0500fafafb0406fcff00ffff 183 | fe03fc00fd00fdfef9fe0000fb02f904 184 | fefeff0106fd09fc01ff01080504fc02 185 | 000104feff04fffcff00fcff00000bfd 186 | fafffe0000fefb02ff04fefeff04ff03 187 | 02030201fc000701fe000401030b020e 188 | feff0002fe0104fffb04000102020efb 189 | fefffd0300040201fc05020402fefd05 190 | 010001060201fffffa0000fd0503fa03 191 | fa05fffdff01fd04fe0002fffc060afb 192 | 010103fcfc02f811010309fdfe00fbfd 193 | 02f90bfefb06f80d010013ff01f9fd07 194 | 05fc00020200fc08ffff0bf900fc0300 195 | 02fe01fd0405f61001ff14fcfc02fe00 196 | 6d05fffd0272f31303f875f70303006f 197 | 05ff01ff0504fe0f03fb1af607ff0002 198 | ff01020301000307fd050af0ff01fe03 199 | 06fffef503fcf70d0bf50eef0005fd05 200 | fffe01060201010400fa0aeffbfc0103 201 | 0005fffaff08f700fcf90704fd05fdfb 202 | 0404feff0303fa0300fb01020004f905 203 | ff01fefbfb0a000303fefe000104f5fe 204 | 050103fd0304f803fd0000fefe06fa05 205 | 03ff00feff08fefffc01ff08fe02fc00 206 | 00fe04fc01050103fb00010400010007 207 | 0000ff0000ff02fb05ff02070302fb04 208 | 00fc04020401010002050403fe02fc02 209 | 05fdfffbfd0304fffdfe0100fb04f804 210 | fa00fe0604f9fd0307ff0001f6fafb05 211 | feffff0203ff07ff0402020303fbff0d 212 | 01fa0603fefd02fefa0002fff804f50d 213 | 01ff01000305fdfd09fcfa0402020001 214 | 000504fe01040000fefffd03ffff0601 215 | fd05fd0400ff02fe0101faff01fbfe02 216 | fa00fb04fdfef80006fa0203000001ff 217 | fc03fd07fefeff03fc01fffbfd02fafc 218 | fa000005ff0102fe03fefc05ff06fbff 219 | 020005fffc01f9fe0afdfa000dfd0500 220 | 0202fffefefbff0003020303fd0d01fc 221 | 02ff01fe03fdfffffdfe020409f8f806 222 | 05fcfc0304fcfe03050afffc060dfdf8 223 | 03fffe0101fe000301fffbfdfe1bfefc 224 | fffc010204feff0103fffafc03fd0113 225 | 05fffffdfcfcfb0100ffffff06fe0bfb 226 | 010202fe020500000006fcfcfd0afd01 227 | 080501000309fdfdfa0502040bfe000c 228 | 01fa01fc08fc07fb051300f5ffff05fd 229 | fef00c02020502f706fcfc0e03fa0400 230 | fbf901ff02fb0bf7f702f51002f80504 231 | f8000703000dfefefcf4050507fbfb00 232 | 020206fc001b01f406faf91404030203 233 | 06000700fa14fef1f4f4ed11fdff08fc 234 | fdfb09fc06ffff041afaf9fe0301ff02 235 | 080209fcfdfefbfffdf5100c020700f6 236 | fdfb06f8fe00fd0517fa040cf200fc00 237 | 0105f90202fffe00fff800070b02fcfe 238 | fefa000402fffffbfbfefcfc0206fb00 239 | 07ffff030007ff01fffd09fdfc06ff01 240 | f6fcff05fb05fdf500fa0004fd0600fa 241 | 7ffbfb030374fef5ff016aff0105ff6b 242 | fb03ff01fcff00fffffd06ff04fdfefd 243 | fbf7050305fc0504ffff02fc06fefc00 244 | 00fdfbf90101fcfe0301fbfe030103fa 245 | 0701ff030003f5fffa01fdff0206fbfe 246 | 00fe000300fd00fe0100090002fcff04 247 | 0001ff03fefdfefbfdfe02fffdfdff03 248 | 0000ffff06fffff9fffa0303feff0101 249 | fffbfdfefefefffd00ff060104070004 250 | 5903fd01fd5d04fc03045cfefffe0263 251 | 0102010002fdfc00fdfeff0005000303 252 | fffd0002fe00fd0002fd02fffe0301fe 253 | 02fb02fb03fcfdfdff03000000040503 254 | 02fdfe0102010600fcfcfffd02fe0200 255 | ff00fcfdfdfe02ff01fe00fefe00fe04 256 | ff02ff0403fe03fc04fefefdff020500 257 | fe04fe01fdfd04fffdfffe01fcfe0201 258 | fd0003ff0500ffff00ffffff02ff05fd 259 | 050003ff02fe0303fc0104fd060401fe 260 | 0403fdfd04ffff01fefe0204fd03fb05 261 | 0103010301fafffa05ff020100ff0001 262 | fd02ffff00fb00040003ff00020100fb 263 | 01040101fe0100fdfe02010000010100 264 | fefd01000101ff03010301fafd000103 265 | fafffffbfd0401060100fe01ff03fe03 266 | 0101ff000103feff01fa00fe0403fd01 267 | 00fb05fb0107fefffc01fcf9fd01fdff 268 | 01fafe02ff03fd0201fb01fd020400ff 269 | fffcfdfefe02020200fc02030100fffe 270 | fe020500fff9040001000002fd00fe00 271 | faf9fc02fdf804000101fc010203fbff 272 | fffb03fb04000303fe0301fc010002ff 273 | 02fb06ffff030603fcfefb00fffb0200 274 | 0700feff05000301fe0000ff02fd0200 275 | ff0105fe000405030002fcfd04000200 276 | fbff05fb010203000202ff0002fafeff 277 | 030001040701010006020002fef40000 278 | 03ff02ff0103ff040302030102000102 279 | 000003ff01f90300fb0300fbff00ff01 280 | 0103ffff06010400010103fe00fefb01 281 | f80302fafefd0600fc040200ff01feff 282 | 000003fefeff0003ff000303ff0201fb 283 | ff05fb04ff01010300fd02fdfdfe04f8 284 | 01fffefdfdfe0000fdfc03fefeff01f8 285 | 00000301ff02fefcfffe01ff0503fc02 286 | f901030402fb0004fefffc05ff01ff02 287 | fe00f700fb000000fcff02fefefd00ff 288 | fd020400fa01020304040002fb0000fe 289 | fdfeff00fdfc0102fd0002fb02000105 290 | fe0201fdfc03fffd0003fa0200fdfe05 291 | feffff00fd00fefe0201fe0307010105 292 | 0501fffff901fc0000fd03fcff00fd06 293 | 04fa03fdfe0306fb04feff00ffff0300 294 | 00000200f9fe00fffe01fffd0002fdfc 295 | 5aff06fcfe5e04fbfefe5f040302ff60 296 | fdfc02fd0200fd02fc0201fd00fefcfd 297 | 02060000fffd03fdfc000004ff030002 298 | fdfc0106fe0104fffe0004fd02fefb02 299 | 00fffdfd00010200fdfe0004fcfefdfe 300 | 02fffc04fffefefcfa0000000400fffa 301 | 00fbfe0001fb0103fe04fe00fffefffe 302 | 00feff0601fc02020100fd0205fa0002 303 | fffffdfe0004fffbfeff0001fa010000 304 | 0003fd07ff000105fc0000f7fefc0500 305 | fd00fefd05fffb02000104fafefb01ff 306 | 0302fe04000201fdfe0000fd0201fdfe 307 | feff03fd03000005feff03fe0100fe03 308 | 0501030002ff00fe02fefef806fa0604 309 | fafefb02030402fe0402fefe0201fbfc 310 | ff02020202000106fdfa0003fb0304fc 311 | 060303fdfe040202f9fa02fff905fdfd 312 | 04feff0afb0102040200fdfffbfe03fe 313 | 010b01fffbfe000bfe00ff05ff0401fb 314 | ff03fd0b0403fc0d00ff0104000302ff 315 | fdfdfe04000303fcfe03fb01010003fa 316 | fe070102fcfc01fdfbff0203000003fb 317 | 040301040000000100fd03fd00fd04fd 318 | fffe0202fffdfffdfbfcff030006fffb 319 | 02fefd03030102ff01fb0403fd010502 320 | fc01ff00fefafcf90302010204fd07fe 321 | 0102fd02ff0003feff0401fb03fc01fd 322 | ff01fc01fefc01fc00fefcfefd010005 323 | fb0000fefefefcfdff0205fd02ff01ff 324 | fe0300fcffffff02ffff02fefc01ff00 325 | 01fcfcfe02fdfe01fe01060001ffff00 326 | 0300fd0106fdf8fd0102fffb01fffbff 327 | 02fe0602fafe000200000702fe0102fe 328 | ff000700fe01ff00ff020500f8fdfeff 329 | fe0104020302fd0201030200ff0008ff 330 | ff0100feff0001ff00ff00ff00fffdff 331 | fe0302fcff00ff02fefbfffefe02ff01 332 | fb02ffff0302fffdfd000002fefc0304 333 | 0202fefffefcfd0201ff000003fff9fe 334 | fefc020201020205ff00ff0101ff0003 335 | feff0201fe01fe00fd000100feff05fb 336 | 0002020103fd0304fe02fdffff020101 337 | 03020504faffff030000fcfd00020307 338 | 03020102fbfcff010400fcfffcfeff02 339 | 030003fefe010102fcfd010100020105 340 | 61fd0100fc5dfd04fd0161fe0001fd59 341 | 03fd01ffff0100060103fb01ff020600 342 | 00fd01fffeff010101ff030302020601 343 | 030000fd03020206fa0303f8fd020102 344 | 040606fa03fc020300fe04fd02ff0202 345 | 0801fc00fd01fa0100010100ff00feff 346 | 03010100fd02000501fd01030103fc02 347 | fffffdfff7ff00fdfe010506ff01fc02 348 | 0801fffbfa02fcfd00fd01020002fffd 349 | fe03ff03fcfdff030102fd00ff00ff00 350 | fd00fefe000302030403030302fffefd 351 | 08fe00fd0004fdff000101fffe020201 352 | ff01fd00feff0203fd0203fefc0501ff 353 | 010402010002fe0402fe03fffd02ff02 354 | 0200fffe03fc030508fa0301fefd0304 355 | 0201fd00ff0302ff01fd03fbfb000200 356 | fff9ff0001fffc03fbfffffffa00fc02 357 | 04ffff020300030004ff03ff08f90003 358 | 0603ff02000300ff00030101fa040500 359 | fe0200fffd04ff00f0fffffe07fd05fe 360 | f9fff804fa0300fe0104fb0002ff05f8 361 | fe02f904fb06fd03fa020003fbfefefe 362 | f8fdfe03ff030003000101fcfcfe03ff 363 | 01fe01fcfdfffffe0afdfffe02fc01fe 364 | 06f901020204ff0006fafeff04fbfe04 365 | fafc0202fa0400fcf8020106fa00ff04 366 | fb020101fafefb0405fdfb03fffeff04 367 | 03ff02fd04ff02fdfbfffe01080401fe 368 | f8ff03fd04fdfdfefe00fcfefe040401 369 | ff0206ff0202fbfefd00040400ff01fe 370 | fafdfe04050203fd0503fefdf9fa0101 371 | ff020401070303fcfb00ff03f8fcfe01 372 | feffff0400000601fd0001fe02f7ff00 373 | 00fb00fefeff02fdffff00010bf701fe 374 | 030303fefa0201000406fc00f5fb0105 375 | faf604020403fe02fffefcf9010201ff 376 | f8fefffffa0a00fffffcfd00fbfefcfc 377 | f9fb03fd020402fbfdfeff01fffefcfd 378 | fdff0000fc02030205fc0401fb02ffff 379 | fbf9fffefdf9fefcfb0600000307fdff 380 | fcfc0504fc020001060003fffafefe00 381 | f9fbfe05fcfd000004fe040202000001 382 | 05050105fdfe00ff02fc01ffff01fdff 383 | 09fc03fcfcfdfffff9fcfd020404fcff 384 | 000201010109ff0205fffffefe00fffa 385 | 7fff00fefd6cf9fb04025d0606f8fc58 386 | 000605fffd0dfefd03fdff0103000100 387 | f80602050403f400fa07ffff00fd00fa 388 | 090a010000fff9fdfc050402fc010100 389 | fe0c050000fdfa03f000fcfd03fd0100 390 | fbfb02fe020200fc02fffefafdfe02fe 391 | fefbfef9fefffefffe020702fffb0501 392 | fcfafcfffefa02f8fd00fe03fbf900fd 393 | 00fe02fefffffffdfe02fe02010001ff 394 | 6cff0400006afffaff046f0002000370 395 | fff803fdfffffcf500000103fb05fe01 396 | fdfcfe0102ff000002060401fdfe0101 397 | fdfdfffbff04fffdfcfe03fe04fc05fc 398 | f9fb00fd02010000fffbfe0100f802fd 399 | 0407faff05fbfc0204030402fb000400 400 | 00fe03ff02fd000101fe04fffd000202 401 | 02ffff01fd05fe00fb0201ff00ff0305 402 | 010306fa01fe0301010704f80303fe02 403 | 02ff02fefc01feff01fefefd04020502 404 | 0001fdfd04f8fafd00fa00fdfcfb00ff 405 | ff0104f8fdfafb000202fd0005fe0001 406 | 0000030002fcfafe040400fb0300feff 407 | ff0200020203faff00010202fdf9ff01 408 | 0003ff02fe010004ff04fe01f90304fe 409 | 03fffdfb030702fc02f9fe01000002fe 410 | 02fefd05fb020103040202fcff02ffff 411 | fffffe03fe0303fffb0204ff030306fd 412 | 06fe00010001fcfcfffbfefc0708fe05 413 | fdfa000001fdfffdfdfe0003fdfe02fc 414 | 00fd0005fc04fefffefcfefbfd0503fd 415 | 04fefa0400fffcfd00fd01fdfffefe01 416 | 01fc0103fa01fe0001fafb01fffcfe02 417 | 05f9f003fd050b05fc0101fffffffefc 418 | fe0a02fe02070a0500fffafdfffd0300 419 | 04ff0504040303fe0103ff0201fbfffa 420 | f504f2fd02fefd0101000009fd06fefc 421 | 1811070c05020100010102fefefa0001 422 | 1c0e04f9050100010003020306ff0203 423 | 020af80201fdfd03fc0206fefeff00fe 424 | 111a06fe00ffff05ff0501fdfffe00ff 425 | 040c02f8f8f8f9fffbfbfcfc000002ff 426 | fdfc01ff0004000301010001fdfffb00 427 | fffe0002f8fc00050302fdfe0000feff 428 | fefc0000fefffb0102fe04fdfe02fe01 429 | 05000500fe00fffcfd020200fefffe01 430 | 030500fefffa030304fe0501fd06fefe 431 | 0001fefcfdfc0003ff010100fe0200fb 432 | 02fffbfefdfdff07f8feffff0304f4fd 433 | 00fa01ff04fc0302fbfffbfa00fe03fe 434 | fffdfffbfffcfd03fa03f90002fffcfc 435 | 03ff040300fc01fc01010100fc0bfaff 436 | fb030100ff040001feff05feff00fd01 437 | fe04fef9fd04f9fafffc03feffff0105 438 | 020102ff02fdfffbfb0001fdfefffcfe 439 | 6b040305fd6dfe06fcfe6d06fffeff72 440 | fe04fb01010007ff00fffd0202000201 441 | 00fe0203fdfc01fa0102f8fcfefefdfa 442 | fd0002020006010104fb01ff00feff00 443 | feff0505fffffdfbfdfbfeff04fdfb02 444 | 0700fd000006fefffdfe01070204fdff 445 | 0403feff020100fdfffefc010004f8fe 446 | fbfefd0301fe03fc01fcfdfd04fd04fc 447 | 03010101040303fc00f9ff0303040100 448 | 0101fcfefffc0401fafcff00fd01ff02 449 | fd03010000fdfd0300fefe00fefc03ff 450 | 03010502ff01fffdfdfefbff0003fcfb 451 | fc07050001fafd00fe0001010202f900 452 | 0000fe020301fe000200ff010203fc03 453 | fffc000a020303fd0400fd000000fc08 454 | 06061202fbfffd0100f6ff0103fffd01 455 | fb000200fd02fd04fdfafbfe00fd0105 456 | 060105f9020106ffff01fb010402fcfe 457 | 0509071d02fe0107fb05fafeff020101 458 | 02f9041dfe01ff070100ff0602fcfa00 459 | 00fd070c02fffcfd0001fd02020005fa 460 | 030a080dfd0003fefffcff01fd01ff03 461 | 00fe051404fa02f60101fcfeff01f901 462 | ffff02fff802ff020002040200040600 463 | fb01010000ff00fffe03ff06fffb01f9 464 | fafefe01fcff0203f9f8feff06fcfc00 465 | 0002fdfffffd00fefffd03fbfefefff8 466 | 000100fffdff01fc01020208ff0003f8 467 | fdfef9fc00fe02ff09ff04ff020202fe 468 | 0000fdfa030102fb04fd05fffeff02fc 469 | fefefa000800ff03fd0103fbfcfcf8fe 470 | 02fdfefe07fefafefdfffffefcfafaf8 471 | 0000fe0101fafdfdfe090004fefffefd 472 | fafcffff05fcff01fafef9fffbfd00fd 473 | fdfd06ff02fffb0003ff05fcf6fd02ff 474 | 0001020000fbfc0308ff010503030000 475 | fefe01ff03fe0304040004fd02010002 476 | fffd0101fa000100fefefe01fb0201fe 477 | 02fdfe0002f603fb00ff01fe00fffcfa 478 | fd0000fffffe0100ff030500070000fd 479 | 04fe02fe010205030000fc0303fd0001 480 | 06ff000509080001fcfdfe0601030502 481 | 04fdfd0403010003040202fc01020402 482 | ff00fefc000601fb0003000301000405 483 | 00fdf8fffe00fd03fafc03fe05020007 484 | 6b01fdfe01680400fefb67f90503016c 485 | fa0304fe01ff03000006fcfefe01ff05 486 | f9fdfcfe01fd0301fdf8fdf8fe01fa00 487 | ff04fe01feff0103fbfef9fc02010600 488 | fefffef805fbfd06fd01f9000103ff04 489 | 1604fffcfffcfffbfd00fcfc01fefcff 490 | 0b0a0d03fd0202fc0001fd0106fdfeff 491 | f407fff8fe0501fd05f9070004fdf9ff 492 | 16100403f9ff04fefbfc0002fe0201fc 493 | 040b0814ff05fffafefd03fdfdfdfaff 494 | f70afa06fe040101fd06040003040100 495 | 1502060805fa04fb01fefa03ff0200fd 496 | fe080320080102fd02fef901feff0003 497 | f407ff1907fffef5fdf6fd02fef7fdff 498 | ff00fffc01fa02010200ff00fffc01fb 499 | fe03fbfcfbfeff0402fffcfff7fffb03 500 | 02ff01fffcfdff04fbfbfefcfb05fbfe 501 | 0007fefffffdfdfd0201fd0000fe00fa 502 | 04fffe020303010202fefffcfb00fffd 503 | fef600fd0204fc01ff030000fefe0201 504 | 0401fcfeff06fbfe030401fd00fc02f8 505 | 04fefc03fd07ff00fd000102fbfcfdf6 506 | 00fffd00030605ff0101fbfffaff01fd 507 | 02fafd01f6fbfa02fffd03050200fc02 508 | fdfafcfcff06fe02faf90002fefa01fd 509 | 02fb0200020203fffc00ff03fb030005 510 | 05fd0502fff8fefa0001ff07fd00fafc 511 | 0302020106060202ff02fffffc02ff02 512 | 020404fbff0304fb0101fefe01feff00 513 | fefa00f9f6fb0104fdff000001fcfb00 514 | 000203fd02000104fe00fefefdfffb01 515 | fffa0001ff010301fafcfe0000fdfa00 516 | ffff00fe0101fb00fd00fffe01000500 517 | 02060104fe000200fefbffff03ff0302 518 | fcffffff01fc0301ff000200feff0104 519 | fe0403fe020101fdfcfa00f902000503 520 | 03fc03020a010304fbfdff00000301fd 521 | 060204fb0002fefd03fbfdfcfcfe0100 522 | fafafb01fefe0202080202fb02feff00 523 | 01ff0105fff700f90000fdfe0604fe01 524 | 01fc02030000fefe00fa0202030203ff 525 | 05fce814fff7fefe00fc01fdfe0301fd 526 | 13220a1301fdfffbf9fffcff02000300 527 | f9f50bfafb000202fc01f8fbfefdfdfc 528 | 23fc05100406fffbfdfd00f8fefe0200 529 | 7f170f020675fcfdfff969fbf9fc0565 530 | 0d0010f9020eff0403fb01ff02fefdff 531 | 05fbfe0bfdfafc0401020100fff900fe 532 | 11130800fef9ff02fe0201000403fa04 533 | ff020cf301fefd00fa0401fcfd03f9f9 534 | 06061600f90afa0002fa110001ec0100 535 | 020e0900f2f908000bfdff00f7bce300 536 | 0e14140003140e00fa0003000eb6e900 537 | 0f222200010a020006ed11000fcd0b00 538 | 0c130d00fa00fd000ef10c00fee60500 539 | fb092100081001000c18ff000af41a00 540 | fd1f1a00fa1e09000c03fb0029ef0d00 541 | f9182600081a0400faf8020020d5fc00 542 | 03291c00f5040700100c10000bd00300 543 | 060f0900f4070c000702fa00ffee0e00 544 | 021219000b000a000cfb0a0017242800 545 | 0d26230006140200f2f708001e1d3100 546 | 04212500fc0e0a000c1011002bf52600 547 | 151d1c00fd06fa00080efb002dff2200 548 | fc191600efecf9000cf9f9001a090b00 549 | fef50000f6090300fb160f001c062700 550 | 06131400fd0a18000b0c0e001be42700 551 | 10111000071904000f0e150021dd2200 552 | 11fb1400fd1a15000e10fe0031ec2800 553 | 05092000fc03000004e6fd0010ee0f00 554 | faf4fe00f60404000602ff000a001700 555 | fdfe0800fb04f500f806f8000ee91500 556 | 08f30700fc0e0600fb08090005ed0c00 557 | f7f81000f404fa00fdf80f0019f91900 558 | 02031a00fc091600e9f5fc0002fb0e00 559 | f70cfd00e41ff8000d0e000005070a00 560 | ff04f500f419f500f3fc140005140c00 561 | 010c07001af5fc00f3edfa0007371000 562 | f5ff06000ffef90001030600eb08e900 563 | fe0b0300fd160a0002180e00e0e4e900 564 | 050ffb00f50af30007f3f10003fbfb00 565 | f7f0f400ec0e0200f2f6fb00061e1400 566 | 0dfb0c00251b0100f6ee0500174c3400 567 | fae4ef0002ee0300f6f5f60009030800 568 | f9fc1500fafc0000f50dfe00eed7f800 569 | 0c000a001be60f0008eef100fe040400 570 | f3fefe001ae90b000b08030006380f00 571 | 0efff20027101200fb0514001e442000 572 | 0c0c0f0017e2f800f8020900fc09fd00 573 | 01170c001ed8fc0005ef0000f4e5f000 574 | 0201180005fe08000011f400060e0700 575 | ff17020012f10b000107fb000e220a00 576 | 00f6ed0025fb1400f3130f00102a1400 577 | 04fbfa0024e4ff00f8f9ee00fcf2e900 578 | fd06fa000ceae800f8ed0900eff8e400 579 | f0100800fa08ed00ff020400faf7f800 580 | 0bf50000010d1b000b050b0002f30400 581 | f8ecff00360a1400f9fa1200fc0a1000 582 | e4f3ff002101fa00fb081200f4f7ee00 583 | f300f300fff7f1000d0e0e0002faee00 584 | 171c0f0000fff7000113ff00fdfefe00 585 | 0a2a1b000ffdfb00f00afe000709fd00 586 | 0afdf800fc0afa0011e5fd00120bff00 587 | 0cfcf50001fa0500fee8f40009f80300 588 | 0622fb0011ebfe00fdf6f4000212f200 589 | f8fdf30002edfb00130a000000faf500 590 | 00fbea0010faee00090705000a1b0a00 591 | fcc3ca001206fb00f6f0090012140400 592 | efe3ea000cfffa00fffafd0006130a00 593 | 0a14030019fcfb0003f5fa002016fd00 594 | efdff50004e4fb000def04000301ef00 595 | f1eef4001902f500fde7f5000df70000 596 | f1c6db001d300900f8ccf2001f070000 597 | fbfae8001326050004f207001110f600 598 | 0e2303000013f20008fcf00004fdf500 599 | 070300000cf4ef00f802ef0001f9ea00 600 | fc23f90018ea0100f1ece60003fcfe00 601 | efd2d8000e01e100fae800001afe0b00 602 | fe04f9000efdfd00f7eefb00fc040b00 603 | 0b3d130011081100fbf1f90018040600 604 | 050d0b00fce1fa00092604000e0c0500 605 | 1101fc00fddfee00fb09f7000df7f700 606 | 02d0db0002f7e900020c0f00fdfef300 607 | 02f4f200ffe504000f0f120007faf900 608 | 0d1c090017ec080000e6fb000cffea00 609 | f0faf600ebe8f800090dfe00f2000400 610 | f9fff100f7d8fe00ff05f4000df5f200 611 | f504f800190930000313020003f7fd00 612 | faf0eb00090a05000c10050001fef900 613 | fcf4f000eff5e400f411f300f4fb0f00 614 | eeeaea00f90a06000210fa00f5050c00 615 | eff8f40007031d000002ef0005dc0100 616 | f009f300234533000c0df40006f2fe00 617 | 0002f60016342300ff0f0400fee90400 618 | 02090300f4f4f200fa0e0600f2f3fb00 619 | fbdaf30011381d000c13040007e8ff00 620 | f3fe06000e4c2d0000170b0004d1fe00 621 | 032513002e7f6300081006000ce90d00 622 | 052513002c5344000414010002e9f800 623 | 061e19000617170007070b0008f90c00 624 | eedbf900e2cbe300050c0000f7ea0700 625 | edf40100e4c3db000e151400feeafa00 626 | 0018000002f1ee00fe12f80009e9ee00 627 | f503f600f4dbe800fc1600000ef3f500 628 | 06080a00f6e5e900fd0bf600fcf90800 629 | f6f5fb00ebb4c800f00afc00faeffa00 630 | fdf3fe00e1b1d4000c140800fcf6f200 631 | f107f900f3cef5000519040011fb0600 632 | fbf4f500f7caee00060cf800f700fe00 633 | 0901f200e7f5f4000f04f400fbfff600 -------------------------------------------------------------------------------- /sim/tv/reg.txt: -------------------------------------------------------------------------------- 1 | 00000002 2 | 00014050 3 | 104030e0 4 | 00000003 5 | 00000000 -------------------------------------------------------------------------------- /sim/tv/sr/fe_buf.txt: -------------------------------------------------------------------------------- 1 | 20 2 | 01 3 | 00 4 | 46c32adaaa45ee5bf4cf7fa61f8080d6212edb47802a9fbcafca24e7519651e3 5 | 155f187bcff11533b5c99c8089197f6a799dbd8080b8806d26655118175a3def 6 | 78b6aff6e1f0eb649448933d0d077fcd2f8ad880211cb3e8017f393e093d802e 7 | dd78bb13fe62db5cf49c11fde8f3af80c6c037187f8095cd66092b43f8803a7f 8 | 47498e4851513c87b4057fea37130680f0c0de94b6fb83580c7f19b77ffa7f7f 9 | db9dd695797207460da4e72d7f364a0c5c5abb4ddc966fa5e5270a94b64ea01f 10 | 5e7fd880807f3b6845681f8080c45ddd8911d47fcce2b139669d7f7fbb1aee79 11 | 666fc19435e89d9480b89e609c83a78063c37f7fb4ccb280baa0acd022657f27 12 | 2ff0679580d387e080ce8080d7487fb5eeb99261e3862175805825f7c5334a60 13 | 7f7fd30b8a6a0046756f7fa1d21d6ea77f7f310233653f46524cbc7fa480cd97 14 | 5d25809b0364d8617f3c8f5ae77965a883b3238b28fa5d705a7dd0ada8aaac10 15 | 910a80da7fa67eebec6ae10035016d04f070d3c4baa45e2af47df104df48d3fa 16 | ea7fd980249bc4de46108b3667efe97f43267f86cfe37f7f83e7c0501f2a5cf0 17 | a43880d27278aac9a27f89f09d7e89c03a35c74d37a29404cbd5122c5493de7f 18 | 8b7ff4f3878576800e0e717f75a173de6205fac8d1ad7b2f51cd5862102a587f 19 | 7fe9d578170d7fc7e29ac97b4b80af7f8080edd5e97fcbb2a5e0a898651780f4 20 | 5cf67ff64b7fd79479cc807f5a57ef7ffd7f802a9b1db8cf8e932e1ea896cdca 21 | 95da9a7f89c74a266780b17a497fbdf948a780aaf1c47f2c9be9c0b2c814c17f 22 | 753f7b7f4397fcf52eded84fec7f5340b2f77fd0f3649366e6bb7f38c4547f26 23 | a0b880bfb9fa793d4e92ed7f6be41c44c1c2e0df5180617b913adb7d7feaf54c 24 | 6bf648ad28280251da3d90b16c1073e1331e427fbe02bdc44bd3806bb1b55352 25 | 91a560f19a75af8506fa80d1d62eab64790ef3aa31343990e56fdc1da0707fa1 26 | 887d1b166678f69ba27fda802280e5550e0fd4c932c47f8a94127f8a9ac87d7f 27 | f559c6808c80d87f5cf6946cdf81b477d699c52691b05b963fbf5680249d3dc5 28 | 72c0b5dcb632237fab3350f2844c24747f7f7e6d6ddcf87f7c3d12d68080a1ad 29 | bd5b7f30581aca7f5cd57f2fe942344a382a687fdb2df6ac8b809b76a20ade34 30 | d4bbe10fbb40884f2b3434dc247fae926a921fa4f7b3a684d68fa3e84734b207 31 | 3080c0495e22f06985f74e1c6ea3157f7f451ba24acca17a1befafa582da3db2 32 | 904084751f9b4f67404f7f9e4a80c41d517fd838b092bd1c068669ed807fb5bf 33 | 81eab5d580525d0ce78ba31a468ff1eb2d356a7f80807f7f627081726eba5539 34 | d26edbe790cb8028988fee9ed13c33bc637f7f311daa7fcb65cf647f057f4304 35 | 21783219a69a4e8e800fd4a1b9927fa580f7b55c1137078064ec6677d7577f0b 36 | 20 37 | 01 38 | 00 39 | 83bdbf9f7fe82f9261012757808e2b7f8708883814b1a8818b3f2d3880539938 40 | fd7e2124e37dd51b3fd5e4c91daa781df2829573833ce67f80eff4954dbdf8d0 41 | f6ba0579a12842931ca4ce27807f7e2cf5a2fa5d80a27fa2cdff9bd326a10a85 42 | 667895c1bbe037066584b2f6e3738c6968213d910e800a3da41696c9ff6f7fff 43 | f8aee0f27f21e9172f8a63cccb0bb49264763c7f90db48a1807fc2fdde923132 44 | 744d72d67fd3268043dab98085622abd74c3dee001c736ba7f65b6a1f38ff73e 45 | 993bcac6ad5b007cff2df67f13c0f32d891ef37fcc808046e94a467f80aab575 46 | 7f178180e21f7feda60a7f035715062c7aa67173cb64e8121c084d078a80c266 47 | df7f45a41caa80f1cdfb20fad4781a427fb2fe800082e4f22569808928503473 48 | d9632909047fc231df10a0fe86d1a61f9f7fbe7dc3a7fb077f667f82bd795fc0 49 | 77f5213c08592beab7d80fc75a74a139b780036bb2794de3f662d05c98d50f80 50 | 7ffc0d4e80a42cf3ad9fcb68137efd0fa723800aa482e48c0280aa6bb980ae7f 51 | 7f96335ccb7fcd1580890e0cc9e44b9cf1325c86c430ba30fff01b0cb117d2fc 52 | 8d4ceafba002d3a00159d9dc2655c83afeed297275807fbc8ff043ec80c999e9 53 | 50f8dab20557288a43d3a195b8bb84961380137f9958b2c0506451d4afb1227f 54 | f0a92d584ec763459eac982ebfdf484fb1387f446db5fe8bfae7df7fbef40167 55 | 809705a72ad67ff410e08074bb59b1eb8071c8864331f5ce80cd7f59b9e16c0b 56 | 0170f780dc228f7fd463ba5bba327fbbee79757fe69ceeedbd927f95f690f37e 57 | 229a33a5f9436e8de69655b8d33a0a5a4f7ebc7f227f49287ad938738d7a6f1b 58 | 273097ea5e3ddef4d7799ff90daae3352af4f9da01d05fdd497ffe4b807ffe52 59 | 92d630808d68522f86164909f4a55d4c98c2ad18d0c38f1de9ed5a64ccf967cb 60 | e854ad126ee08084e3763be88cc050cf3e7f60e5ab7f7fb034629491c37f5aea 61 | 3c7f44bcd6df7f58e8398010a59abfc211c167de6b581b79ad8111aed8d07fe0 62 | 10c7915b7ffd17172195db0965cfbaed48c8c95b437f35efbb671ba212bc0bd7 63 | 02ed60b1664cdb3ac4103f1e41a97a0580d641fdee1493bc7468442bea81a2f5 64 | 7f85f77f175680807f03022b0a1a1930a602c7f91e25d55d5b797bc480acdd9f 65 | 7c137fc4aefd37425b117e8f1746944b732e64ea06667f539a0215274be5be4a 66 | ec82c67bc162125579fef3f4c7677f64f76d8019e544c31c5e9986f2d87f0d7f 67 | e9247faa47a614cf7f9931647fcc1d59438066b48560e646208f107f807f86b8 68 | 72a5a2ed7f947f8070b5489315c87fd4cdac614c5f9816de807e1f3f116c5b0e 69 | 7f7fbc7f94e62ac713fa017f29574d1d7fd3c1e4b8da3681491471b47ff01064 70 | 83858b3b732b7f80390c800bbc350562c0577f9436787f1d0ee5af4e7fff3d80 71 | 20 72 | 01 73 | 00 74 | 6f0d31ac807f9aa6d0d3fd7f807f438000000000000000000000000000000000 75 | 7e72e5241562953634aa7fb72d311f1400000000000000000000000000000000 76 | 809b6283448467764c0b39d0802ef2ef00000000000000000000000000000000 77 | e59994f664ae5e0424077e4807a580df00000000000000000000000000000000 78 | 6f3008d017d9080b5a8051807dcf230000000000000000000000000000000000 79 | 0c3198f9027f7faa0da965101f7f987f00000000000000000000000000000000 80 | 639c36d28003083b073de543f04abacb00000000000000000000000000000000 81 | fa076d40c813d901287f9d39c1d6194000000000000000000000000000000000 82 | 63bffcaac68f400c457566fb8020d06300000000000000000000000000000000 83 | 992fb07faf264fee7f3359f57f1bef7500000000000000000000000000000000 84 | af19887f657c52766e230437d3802dc200000000000000000000000000000000 85 | 407f358034803e484ec3c3a36f3694a600000000000000000000000000000000 86 | 7f9a0e807f4b7f0a4e28eaf25f7f7f7000000000000000000000000000000000 87 | 7fd1deaced807f97ead09b8c30d0b59800000000000000000000000000000000 88 | d226dab4800411af807f9894ae0ce9f200000000000000000000000000000000 89 | 2f7580857f840752af803580c63c264c00000000000000000000000000000000 90 | 7fdc802c095f7fd9aac5fe679a7cb53900000000000000000000000000000000 91 | ecc5920380cda05b8bf17ffc9b9de83f00000000000000000000000000000000 92 | 5faba3ff807f60724038a3d4d4bd4fbc00000000000000000000000000000000 93 | 024f10ebc8ec50257f68325f5f4c788000000000000000000000000000000000 94 | 80d83b2bbb1353ca79672de7fb9d652900000000000000000000000000000000 95 | 7808c8357b1a1f2280343fa1cb82bcfe00000000000000000000000000000000 96 | 3e026844f4f10f0d5a4c31a59c80f30300000000000000000000000000000000 97 | 6038d5f490e0d4b6c17f938ba3e594f000000000000000000000000000000000 98 | 30737f41ad5283f6dd7d837ef6307f8000000000000000000000000000000000 99 | 9686940274562b31627f3854b3dbdbb000000000000000000000000000000000 100 | 44a57fec12cc2dcb7fc5807f912d911800000000000000000000000000000000 101 | bc8077292a7fdcaaf3f88071805227f200000000000000000000000000000000 102 | af318fc980ad7faf7f3c7d83680cf5b800000000000000000000000000000000 103 | 7f2bd6e6e934806f06ce0d2bd680141e00000000000000000000000000000000 104 | a9901d45598080743e80a9f2e3006a0000000000000000000000000000000000 105 | 1248a41030c947049de366f58d15527800000000000000000000000000000000 106 | 20 107 | 01 108 | 00 109 | fd2fc273800f10807f9d6b39bf40fbefbf850b631198dbdee470b4676276779a 110 | 7f9fea48609daf1e9d9a5480464b0ff7f16cc019bb8080162d4e1c9a697d7247 111 | 305109d35ccb126147a880d9d3ea7f34d4c225f0baddf1ef632be6a571806d4a 112 | 16eaf61a19061627bfa05d8020a35f7fdf197f4ae1c0647fdc7faf7fc9805836 113 | 0f99a9d295562fd4317f8090540d60cb8080858e0f034dab2dfd80253f7f029a 114 | b4f61377803080b63dd5ae5ab3e6dc21a791fac00d7fc17f4ffe76177f59800e 115 | 6543ec0024e67f3796d036427f22adac7f093e17aa91466b45dd1ff55ca38338 116 | e847aae5d8657c057fa55269ed0aa080e7a67c00057f8cbd4c5e7fa48036f795 117 | 9ff37f873bdd74c938ccd9503fe8217ff5ce7f7f80e2771880551bcc280d7fbb 118 | de49f56007271cb33f9baa80460ecff4c6fbda5b805b82487c568cc46d0eb595 119 | 535838f4da4e36070a3d566be998807858461c58ff9674cd8c17b8ccf87f9fec 120 | 7f62c47f3e117f68797befdf65e1cfd4ecda8b297f355c418066d1191d7f61e7 121 | 80634fcb7fd91bd90e7f7f4aafb6d9695d4335008055b5ecea242322771fcb7f 122 | 21ee72edd5639e704a17bd7e96b68077987fa5c97b1b7f270ef1a5902c287708 123 | e96e07943f3395fb80809b6bc5086f2c8081655485a225f643d787808080a20f 124 | 273afb16d5d9cb766f12bb3e7f80cb9815d49543e7544bbf6c8850755fc9bed0 125 | d62f7cc6c9d64b4cf87f80067ff40f76837fa74109bd71f4bf7f7f9280c89d00 126 | 7f946a67da3a26231425106e7f13cd8080ec80feb2a539936ad4323abdee5cb0 127 | 5def674964f139a7fe87d880aa154cc2107fb38bb6a822f4d57f5989f24d145b 128 | cd0f53c6c77fd28048687fd4df891c19e2d4c4807fceaeedfa55dd2cca75faa6 129 | 5d81a48748849473890ac7e139847f20fe9fcf3db7bf807f8083bb44b200b57f 130 | 8a7d5f23e7676efa60f85972778b30247fd513864ad816459f80a33ba0f57f80 131 | 96a76b21afa4d14a7f3ceb04cf307f89038148aa57a8157f6a2ea26b7fa7f40f 132 | 86cd80a0b7678451a27f64e6abd63576ad2f51b6794b1ddcd11adf30ceed729f 133 | 6480cf7f390a4b78abd3067fee2f9abcc2873269ec03218611b4ac82238e7f06 134 | 23ee27c04cba20828d7f808042a480323e91e805e34f594c6ecdb11b80659f7f 135 | 0adca8ab4e7f333e64ab997129774138552ac18024d54a905cf3eac25f7f54e6 136 | 3754bd6b5decb5703287c080dd43895914fe7d9b277f27c7f3aa40e7ae801a5a 137 | 7f8bfd808d9458d8da0e2c6b557f7f7f02ecaf7fe586280018432364bf7fed69 138 | 0c724edb78a6bc7fecc71c80c68d7f7fab7dd5c914127fc23adda7807fa57667 139 | ed177af07378538f08f17f680d1dbe3c25105173cde547197788525b7f7fff7f 140 | d3a8b11c4dd475454a7ae880dff6baf2d2717b36751158e27fc90e101c779159 141 | 20 142 | 01 143 | 00 144 | d57188805b429899eebc2cd39a38cf597fecf05a70e7cecd2a07808133a90c7f 145 | 7f2142887f5a26c8269156fc7fc9cb00e3560e1b7f5c84c3ee802d02e088240d 146 | bf163f66f9f10be728a4806c49398b46802880f880406b6f4b9eca4fd3008052 147 | 803fbb2832ff2383edb489657f7f7fea6b7f3ad68381a00b1c7f087f1b288c7c 148 | 627e4814f235c1bcc2cf7f8085b2c4b42e8af5cf7f7f09bda457fb026a7f25b3 149 | 37377e40067fe83873c47434b4807f80498027d5097ff201cdd67f7f8855022f 150 | cec5337f8f090e05571a6eb88b808f857f499019ee3020597fc8e0dc6db01ab0 151 | a876ad9a54ca7f1d800c8375cba0eddd071c800080b4d39336696d756d617fb8 152 | b7d217ec3046e7a795a96fa76af2878ca6deb83780c02180554bc906af757f80 153 | 285124802b80374b4cead3b441804d7fa6bc6a7fff354462430580fa498e080f 154 | 145e801577ff0ddf5785097f20949fb0a739cd8369ce2885018a38e7b1e9cd2e 155 | ff3a80746cf8a7e8039445ec6080d0867fb252f4143a50f47f467f75357fd6ff 156 | 4152874e962111efa9ba39290c7fd6dd794bb9ff6853804a4e2d7f1e8077d0e2 157 | 7f45b87f148cdc5ed5926b70cf5a12952a903f1eb1bda093853c335a808f7f80 158 | f13a7ad5ddc87feb7f9efbb40a0e38d02d0667f0b1d1010dece7017fbe3a1580 159 | d25a8051684a1344321f57a9252da99f8074d38aa773b967b035798080b498ec 160 | cd8ed2798066b91a8c829aa04b43937f80f660005ad1158d114946d7a80ed0f6 161 | 58e7964a2abedc937880e27fcdd0600a7f21962c5760807f00ab83207ad625db 162 | 599e1056f01afa80b007be617fc1aee29d2e80809d647e237fc1d6dd5c7fa51c 163 | 2fef7f3f2b7fa02f7f0f8c598062807c6e100e08150434e9579b6a0c2097e0fc 164 | 716770568f3e021cc2808f80523380649e909f48ddfe1ff044e5dc315b7d800e 165 | 7f88125ae0844662488011013f076740197d04b47ca14b5e800c71789fae787f 166 | c4a605ca457ff559a0c65756316fab55878080e4e8409a7f6f297f6fbc806e3a 167 | 6280b3ad803d359ce9d97b7f3f4467fe9b067fea8aac4ddc0c0d2dd2971acf9f 168 | 1b9a0633091a7d977faad47f9b5bbd794c6689d9540a5920f2d57f8006c41d29 169 | 7f60c87f966535f948ed40f77f6c70857fec749c2ce9243d1f382b9c2485808d 170 | 803b86ae988d80a3eb39a904c57fd5611598e46d75f980c8387f495b56552c57 171 | 8000b4f4284b34e67ffc5c92180f8eed6fcf483b52537f571aaa850e80008080 172 | 59249fd6592bc82a7f6e4842cf97b3b686de80ff8454657f6c7dd6bb5f8c6545 173 | 05c50f22248086e2a022f2b011bc377b93747f2ec2f57f7f8045e3b6e4f8a9de 174 | b46505b6218e81cdde990980df43a95d2bb3801d807f803f567f59ba4d7f0ee7 175 | 3e7f80fae5b0562bd4804fba502c2831e72b9ac73dd56d5d7ea0bfbb7f84f8f7 176 | 20 177 | 01 178 | 00 179 | 65087906d97f03d7ab4a0ed2028f053800000000000000000000000000000000 180 | 72df1e7e37e785887f588423cfadc04000000000000000000000000000000000 181 | d7a52f970d64042765798080b7b4e07f00000000000000000000000000000000 182 | d2a6ac149da7af8280d3c8b1cb0ee46f00000000000000000000000000000000 183 | a1a7be71f3807f9c7f7f6d7f7fff0e8100000000000000000000000000000000 184 | b6c75353a580e70808fce1f37f7f966800000000000000000000000000000000 185 | 7fb1049038948047c1b92b48a93960dd00000000000000000000000000000000 186 | 210fe03cd8ee80170c525e687f80408300000000000000000000000000000000 187 | 33be843f9acc5bb228bc7e3a4bf77f8000000000000000000000000000000000 188 | 188c4b043e4d96447f03618a4093669300000000000000000000000000000000 189 | 1e639c80d648179bb04dfe087a2fa58700000000000000000000000000000000 190 | 691a6ccbf00bc480f6c66576b580bf1300000000000000000000000000000000 191 | 7f9c9a583763de10bd15c0b0c559e50800000000000000000000000000000000 192 | 95667ff47fe57f7f147f8e1072015f8a00000000000000000000000000000000 193 | 34751ac08080e144847fd06c6e84db8000000000000000000000000000000000 194 | c95ee99cc380b4117fb928c777698a8000000000000000000000000000000000 195 | c64018cb7d12057f48b5b75e5b3e872300000000000000000000000000000000 196 | 6d8cc763b3bd7f7f309483bc541b7fc300000000000000000000000000000000 197 | 3cea0480197f23d711d509e1da01e89300000000000000000000000000000000 198 | 8052cb21803ba18080da206c3b837fe600000000000000000000000000000000 199 | cc262eb67f80ac805c188cfde07cc10e00000000000000000000000000000000 200 | f4d50a80928076a8b0628367183222d800000000000000000000000000000000 201 | 302c805a753e90ee267fd47f46e3da7700000000000000000000000000000000 202 | 11068c1d7691721380c468b99d80017f00000000000000000000000000000000 203 | 9b183afb1f9a35dda0e170212503809000000000000000000000000000000000 204 | 547f2448af9efba77f39ed2db5bbe67d00000000000000000000000000000000 205 | 497f19be086f1dc57f2694f5fd51a19c00000000000000000000000000000000 206 | 7ffe8072b49b036d657ffbc906307f7f00000000000000000000000000000000 207 | f83ea9d67fa4dee5238adc5ecaddca1500000000000000000000000000000000 208 | 7a52f3d55c2ba9a6c67f08808c80e84700000000000000000000000000000000 209 | 80e7047f47158a807baf7b0e9f69913a00000000000000000000000000000000 210 | f25e80b122b56c68807f7f5a9261f23e00000000000000000000000000000000 211 | 10 212 | 01 213 | 00 214 | 357fd0bbd6809acd48a99b1380140e0cda6780de7f52c2ac7fcdd27fae527f5d 215 | 600993b48080fda7c69479ad5380fd3727de80a7a5ff78bac3f4fe9d97aa675d 216 | 4b7f806599f81af06b0545e380312865185dc7571add0a1144751827b94e34b7 217 | a92f3d802c401281b07fe409eb3c88d901ead686a37f5ee9539884806c7bfb80 218 | 444c087606974c80807f7faf80807fd548f5f9054446e33c8319b855f680ab5f 219 | 180b61d826ddf820670a54045f332c3389e87f80803b500b21112355ec4dd0fd 220 | 7f63c5a3807780917fda7f454ecc98539413f58d110dfe0f9e80234b242a20d7 221 | 2f2edd5d0fdc8355aeeb2ee8f8597f3a804d80de80312e6dab48033d80ab4d58 222 | 7955734af992c1720ce81280b4d8cc2b62482f295f6ee8de7fe97f0670df24aa 223 | b67926b4eb102c6647156a3d8a7ddf3f7f492f8748f47f79351035386880c9c6 224 | df2213258a80a57f1c691c97805353853c7fec8bb980297fcd9b3b5376237a82 225 | 487f295e5f59a6a867af9b187f0ea4f280ab1efcfb19a8ad22224a80e2b48c4c 226 | 056c0b508b55fa01178080df4021b081e8187f3783f780923f5e85a4ec526501 227 | 7fc455cbccb6cf7f48f3870dd32ebe5198b5ec9c3bbc7f80700dc11a815893cf 228 | 03808074bc33d9efae80ab72acb614a57b1ff23a7f7fd3db7f80f8b38e791f7f 229 | 35ad43b68085fcd1aa7f6fcefbb4aec5f0d0dff385037f1ce5bfaf630bf690de 230 | 10 231 | 01 232 | 00 233 | 59807f3c8032e980b966fb80ccc32317924d7f807b1ace597f5249cb0b2b8c3e 234 | 05bff1f5da2384fce05a64808080928c947f9eebe523c77f8c9a30d8dae4ea51 235 | 24798d7a01b4809b0127f6c3a95fc8846f3f0954f187547fe72022f27f956a2a 236 | d4c0ec13b9196a5ea78099357f22b6d87fe3f4936601f64c46805c3d80674344 237 | 08bce0a98a781d7ec3d3c61780dc08ce303af1f7e05b3baa24c1bee1c3086f7f 238 | 6184444e7610797d1f10ed8c7fe67f407a9453469fe323e50ff0f5f5fb418025 239 | 8a55037f39d36c1118cb88e1808c0b26e95aa1a8d0082bdc692cc880d1df80d2 240 | 7f7fae6b14fea6f37f64549bc88d7fdf8af63b9380cbcaef80aaed114e50af95 241 | 80df68eafff247f87f8d7ff7a94f27777f49842ef37f8cb48032d4de1384e15d 242 | 7a072aace14e70f2c031774387ce7fc9dd6d8351808adc0a04fc89ff54f614bd 243 | ef684783c1310e7f5af97fdb70e27fcfac8c7fc781c5f18099cf6e53912c9fd1 244 | 62232875a154726c9c9ec76b99b27a664180e1358306cd5d8fb24d337f2840db 245 | 4d695a7f52ee8e19f2b0e0d04256d780437fc3595aea607980151647396766ad 246 | bd277f611b6686214c35660be1d080a2070538143a7fac517f4b108857764b4c 247 | d6418e2fc15abdf2cb176fb080ef68efcb0269940d93397b80b97fd1e1518906 248 | 089710dceb8f7f6b8061807fe1c8fdf32c290d341d0e807b3c3229b30bb3d760 249 | 10 250 | 01 251 | 00 252 | 474ced61cac1176c2725ea9d807f630500000000000000000000000000000000 253 | 16246f0f75c38595a274af20657cce6600000000000000000000000000000000 254 | 9fc87f56218080bf002ca7c059437f2600000000000000000000000000000000 255 | 2a441b4b1bf8b441ad76a732a1922bfa00000000000000000000000000000000 256 | 7f11ca80413e800cb762ede33eccf93600000000000000000000000000000000 257 | fa14df8eec8c0ca88d9ef36224be9e3f00000000000000000000000000000000 258 | 40e70f6c375294760e171a102cd5b8f200000000000000000000000000000000 259 | 6d701c7f80162df72b157f217f42150800000000000000000000000000000000 260 | f17c4c7fef0a90c87f9b45968044f99d00000000000000000000000000000000 261 | e9b57f1d807f7e007c7f8f17dd03be4300000000000000000000000000000000 262 | f1804f0b826aa40580177fcf8fa7b4fa00000000000000000000000000000000 263 | 7f81790080fdeccf2a52c2ac8031a36300000000000000000000000000000000 264 | 7f787f0daff0bc496db0c07ffd22ddd600000000000000000000000000000000 265 | 2a23e447f0e080d512b72499a180317f00000000000000000000000000000000 266 | 911917c78dc8bd0131701cc96fc17f9d00000000000000000000000000000000 267 | d12f1b847ff201029d36d01b94a9041600000000000000000000000000000000 268 | -------------------------------------------------------------------------------- /sim/tv/sr/param_buf.txt: -------------------------------------------------------------------------------- 1 | 05 2 | 10 3 | 0071a41d86fc 4 | f70ca41d86fc 5 | 0512a41d86fc 6 | febfa41d86fc 7 | e776a41d86fc 8 | fb87a41d86fc 9 | d0d9a41d86fc 10 | a40ea41d86fc 11 | 00a6a41d86fc 12 | 2a76a41d86fc 13 | ff70a41d86fc 14 | ef47a41d86fc 15 | febda41d86fc 16 | ff5fa41d86fc 17 | fa45a41d86fc 18 | e481a41d86fc 19 | 10 20 | 5090dac386fc 21 | 4485dac386fc 22 | 2cd3dac386fc 23 | d3e4dac386fc 24 | 1771dac386fc 25 | 2b88dac386fc 26 | 8000dac386fc 27 | 8acfdac386fc 28 | fdbfdac386fc 29 | 8000dac386fc 30 | 1e7bdac386fc 31 | 9fc5dac386fc 32 | 8000dac386fc 33 | 8000dac386fc 34 | daf1dac386fc 35 | 1565dac386fc 36 | 10 37 | 00cd9a0c86fc 38 | 82ae9a0c86fc 39 | 36a09a0c86fc 40 | 80009a0c86fc 41 | dff29a0c86fc 42 | 64af9a0c86fc 43 | dd429a0c86fc 44 | ac1e9a0c86fc 45 | f4c99a0c86fc 46 | bd449a0c86fc 47 | 80009a0c86fc 48 | 80009a0c86fc 49 | 80009a0c86fc 50 | 80009a0c86fc 51 | 80009a0c86fc 52 | 16659a0c86fc 53 | 10 54 | f9cd987786fc 55 | 99e6987786fc 56 | 3506987786fc 57 | f27e987786fc 58 | ff57987786fc 59 | 466e987786fc 60 | 1671987786fc 61 | fb73987786fc 62 | fc04987786fc 63 | 03fb987786fc 64 | eb4e987786fc 65 | 1904987786fc 66 | ff07987786fc 67 | 0096987786fc 68 | d2cb987786fc 69 | fffc987786fc 70 | 10 71 | 7e818e7186fc 72 | 69018e7186fc 73 | 4c038e7186fc 74 | 5c058e7186fc 75 | 7fff8e7186fc 76 | 6d858e7186fc 77 | 5c848e7186fc 78 | 77048e7186fc 79 | 7fff8e7186fc 80 | 7fff8e7186fc 81 | 6c088e7186fc 82 | 7fff8e7186fc 83 | 7fff8e7186fc 84 | 7a868e7186fc 85 | 60098e7186fc 86 | 7a088e7186fc 87 | -------------------------------------------------------------------------------- /sim/work/makefile: -------------------------------------------------------------------------------- 1 | .PHONY: vcs sim verdi clean 2 | all:vcs sim verdi 3 | 4 | OUTPUT = simv 5 | ALL_DEFINE = +define+DUMP_VPD 6 | VPD_NAME = +vpdfile+${OUTPUT}.vpd 7 | ##========== code coverage command ======= 8 | CM_NAME = -cm_name ${OUTPUT} 9 | CM_DIR = -cm_dir ./${OUTPUT}.vdb 10 | CM = -cm line+cond+fsm+branch+tgl 11 | ##====================================== 12 | vcs: 13 | vcs \ 14 | -f ../flist/filelist.f \ 15 | -timescale=1ns/1ns \ 16 | -full64 +v2k -sverilog -debug_all \ 17 | -fsdb \ 18 | -l vcs.log \ 19 | -notimingcheck \ 20 | -nospecify \ 21 | -o ${OUTPUT} \ 22 | ${CM} \ 23 | ${CM_NAME} \ 24 | ${CM_DIR} \ 25 | ${VPD_NAME} \ 26 | ${ALL_DEFINE} \ 27 | +lint=TFIPC-L \ 28 | +vcs+lic+wait 29 | sim: 30 | ./${OUTPUT} \ 31 | -l sim.log \ 32 | ${CM} \ 33 | ${CM_NAME} \ 34 | ${CM_DIR} \ 35 | ${VPD_NAME} 36 | #show the coverage 37 | dve_cov: 38 | dve -covdir *.vdb & 39 | urg: 40 | urg -dir *.vdb -report urgReport 41 | dve: 42 | dve -vpd ${OUTPUT}.vpd & 43 | verdi : 44 | verdi -sv -f ../flist/filelist.f -ssf tb.fsdb & 45 | clean : 46 | rm -rf *~ core csrc simv* vc_hdrs.h ucli.key urg* *.log novas.* *.fsdb* verdiLog 64* DVEfiles *.vpd *.dat 47 | 48 | --------------------------------------------------------------------------------