Skip to content

Commit

Permalink
Modified CFU-LI 0 and 1 examples popcount, BNN, and mulacc to track e…
Browse files Browse the repository at this point in the history
…volving CFU spec 0.5d.
  • Loading branch information
grayresearch committed Mar 12, 2020
1 parent dce0818 commit 986712a
Show file tree
Hide file tree
Showing 6 changed files with 280 additions and 279 deletions.
66 changes: 39 additions & 27 deletions bnn.v
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,43 @@

// Test bench
module BNNDotProd32TB #(
parameter CFU_FUNC_ID_W = 5,
parameter CFU_REQ_DATA_W = 32,
parameter CFU_RESP_DATA_W = CFU_REQ_DATA_W
) (
input clock,
input clk,
input [15:0] cycle,
input [15:0] lfsr);

reg [1:0] `CFU_REQ_DATA req_data `vp = 0;
reg [0:0] `CFU_RESP_DATA resp_data `vp = 0;
wire [CFU_FUNC_ID_W-1:0] req_func_id = 0;
reg [CFU_REQ_DATA_W-1:0] req_data0 `vp = 0;
reg [CFU_REQ_DATA_W-1:0] req_data1 `vp = 0;
reg [CFU_RESP_DATA_W-1:0] resp_data `vp = 0;

reg `CFU_RESP_DATA xnor_ `vp = 0;
reg `CFU_RESP_DATA answer `vp = 0;
reg [CFU_RESP_DATA_W-1:0] xnor_ `vp = 0;
reg [CFU_RESP_DATA_W-1:0] answer `vp = 0;
int i;
always @* begin
req_data[0] = {cycle-1'b1,cycle};
req_data[1] = {16'b0,lfsr};
req_data0 = {cycle-1'b1,cycle};
req_data1 = {16'b0,lfsr};

xnor_ = req_data[0] ~^ req_data[1];
xnor_ = req_data0 ~^ req_data1;
answer = 0;
for (i = 0; i < CFU_REQ_DATA_W; i = i + 1) begin
if (xnor_[i])
answer = answer + 1;
end
end

BNNDotProd32_CombCFU #(
.CFU_FUNCTION_ID_W(1),
.CFU_REQ_INPUTS(2), .CFU_REQ_DATA_W(CFU_REQ_DATA_W),
.CFU_RESP_OUTPUTS(1), .CFU_RESP_DATA_W(CFU_RESP_DATA_W))
bnn(.req_function_id(1'b0), .req_data, .resp_data);
BNNDotProd32_CFU_LI0 #(
.CFU_FUNC_ID_W(CFU_FUNC_ID_W),
.CFU_REQ_DATA_W(CFU_REQ_DATA_W),
.CFU_RESP_DATA_W(CFU_RESP_DATA_W))
bnn(.req_valid(1'b1), .req_func_id(req_func_id), .req_data0(req_data0), .req_data1(req_data1), .resp_data(resp_data));

always @(posedge clock) begin
if (resp_data[0] != answer)
$display("fail: bnn(%08x, %08x): resp_data[0]=%1d != %1d", req_data[0], req_data[1], resp_data[0], answer);
always @(posedge clk) begin
if (resp_data != answer)
$display("fail: bnn(%08x, %08x): resp_data=%1d != %1d", req_data0, req_data1, resp_data, answer);
end
endmodule

Expand All @@ -53,28 +56,37 @@ endmodule
// A binary neural net has 1b weights and activations, each encoded { 0=>+1, 1=>-1 }.
// The (biased) dot product of W: w*1b weights and A: w*1b activations is popcount(W~^A).
//
// Metadata
// (Obselete) Metadata -- REVIEW
// Supports: REQ_WIDTH==32 or REQ_WIDTH==64
// IID: IID_BNNDotProd
// Functions: {BNNDotProd}
// Inputs: w*1b activations, w*1b weights
// Outputs: w-bit BNN dot product
//
// TODO: figure out how to handle configurable CFU e.g. REQ_WIDTH is 32b *or* 64b.
//
module BNNDotProd32_CombCFU #(
`CFU_L0_PARAMETERS(2,32)
/* Metadata
CFU_LI:
- feature_level: 0
- cfu_req_data_w: [32]
- cfu_resp_data_w: [32]
- cfu_func_id_w: [5]
*/
module BNNDotProd32_CFU_LI0 #(
parameter CFU_FUNC_ID_W = 5,
parameter CFU_REQ_DATA_W = 32,
parameter CFU_RESP_DATA_W = 32
) (
input `CFU_FUNCTION_ID req_function_id,
input [1:0] `CFU_REQ_DATA req_data,
output [0:0] `CFU_RESP_DATA resp_data
input req_valid, // unused
input [CFU_FUNC_ID_W-1:0] req_func_id, // unused
input [CFU_REQ_DATA_W-1:0] req_data0,
input [CFU_REQ_DATA_W-1:0] req_data1,
output [CFU_RESP_DATA_W-1:0] resp_data
);
wire `CFU_DATA xnor_ = req_data[0] ~^ req_data[1];
wire [CFU_REQ_DATA_W-1:0] xnor_ = req_data0 ~^ req_data1;
wire [5:0] count;
Popcount32 count_(.i(xnor_), .popcount(count));
assign resp_data[0] = {26'b0,count};
assign resp_data = {26'b0,count};

// assert(req_function_id == IID_BNNDotProd32.BNNDotProd32)
wire _unused_ok = &{1'b0,req_function_id,1'b0};
wire _unused_ok = &{1'b0,req_valid,req_func_id,1'b0};
endmodule

2 changes: 2 additions & 0 deletions cfu.vh
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

`define CFU_INTERFACE_ID [CFU_INTERFACE_ID_W-1:0]
`define CFU_FUNCTION_ID [CFU_FUNCTION_ID_W-1:0]
`define CFU_FUNC_ID [CFU_FUNC_ID_W-1:0]
`define CFU_REORDER_ID [CFU_REORDER_ID_W-1:0]
`define CFU_REQ_RESP_ID [CFU_REQ_RESP_ID_W-1:0]
`define CFU_REQ_DATA [CFU_REQ_DATA_W-1:0]
`define CFU_RESP_DATA [CFU_RESP_DATA_W-1:0]
`define CFU_ERROR_ID [CFU_ERROR_ID_W-1:0]
`define CFU_ERR_ID [CFU_ERR_ID_W-1:0]

`define CFU_DATA [CFU_RESP_DATA_W-1:0]

Expand Down

0 comments on commit 986712a

Please sign in to comment.