if (k == DIN_NUM_LOG) begin for (i = 0; i < 2 ** k ; i = i + 1) begin assign layer_din[i][2 * DIN_WIDTH - 3:0] = (mul_result[i][2 * DIN_WIDTH - 2])?(~mul_result[i][2 * DIN_WIDTH - 3:0] + 1'b1):mul_result[i][2 * DIN_WIDTH - 3:0]; assign layer_din[i][2 * DIN_WIDTH - 2] = mul_result[i][2 * DIN_WIDTH - 2]; end assign layer_din_valid = mul_valid; endelsebegin for (i = 0; i < 2 ** k; i = i + 1) begin assign layer_din[i] = mla_layer[k + 1].layer_dout[i]; end assign layer_din_valid = mla_layer[k + 1].layer_dout_valid; end
always @ (posedge clk ornegedge rst_n) begin if (~rst_n) begin for (x = 0; x < 2 ** (k - 1) ; x = x + 1) begin layer_dout[x] <= 'b0; end endelseif (layer_din_valid) begin for (x = 0; x < 2 ** (k - 1) ; x = x + 1) begin layer_dout[x] <= {layer_din[2 * x][2 * DIN_WIDTH - 2 + (DIN_NUM_LOG - k)],layer_din[2 * x]} + {layer_din[2 * x + 1][2 * DIN_WIDTH - 2 + (DIN_NUM_LOG - k)],layer_din[2 * x + 1]}; // layer_dout[x] <= layer_din[2 * x] + layer_din[2 * x + 1]; end end end
always @ (posedge clk ornegedge rst_n) begin if (~rst_n) begin layer_dout_valid <= 'b0; endelsebegin layer_dout_valid <= layer_din_valid; end end end endgenerate
functionlogic[DIN_WIDTH - 1:0] data_random(); integer x; x = (DIN_WIDTH)'($urandom_range(0,2 ** DIN_WIDTH)); if (x[DIN_WIDTH - 1] == 1'b1 && x[DIN_WIDTH - 2:0] == 'b0) begin return0;//不产生 -2 ** (DIN_WIDTH - 1) endelsebegin return x; end endfunction
激励产生
1 2 3 4 5 6 7 8 9 10 11 12
initialbegin din_valid = 'b0; repeat(100) begin for (int i = 0; i < 2 ** DIN_NUM_LOG ; i++) begin mla_din1[i * DIN_WIDTH +:DIN_WIDTH] = data_random(); mla_din2[i * DIN_WIDTH +:DIN_WIDTH] = data_random(); end @(negedge clk); din_valid = 1; end $stop; end
参考模型
输入解码函数
将补码形式的logic数据转为带符号的integer类型数据
1 2 3 4 5 6 7
functioninteger decode(logic[DIN_WIDTH - 1:0] din); if(din[DIN_WIDTH - 1] == 1'b1) begin returninteger'(din) - 2 ** DIN_WIDTH; endelsebegin returninteger'(din); end endfunction