From f8d4341a68c5d6b8e51d8e7c59a35e91e7ebce4d Mon Sep 17 00:00:00 2001 From: bsdevlin Date: Tue, 25 Jun 2019 17:53:50 +0800 Subject: [PATCH] Update to fix testbench for bls12 coprocessor --- aws/cl_zcash/verif/tests/.test_zcash.sv.swp | Bin 16384 -> 0 bytes zcash_fpga/src/rtl/bls12_381/bls12_381_top.sv | 5 +- zcash_fpga/src/tb/bls12_381_top_tb.sv | 112 +++++++++++++++--- 3 files changed, 101 insertions(+), 16 deletions(-) delete mode 100644 aws/cl_zcash/verif/tests/.test_zcash.sv.swp diff --git a/aws/cl_zcash/verif/tests/.test_zcash.sv.swp b/aws/cl_zcash/verif/tests/.test_zcash.sv.swp deleted file mode 100644 index 3d2314307bbc3240a217f8c9ab82e01dc7911bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 WF|&J|#B%fiaYP*rpF?pD;P>BxwfP7D diff --git a/zcash_fpga/src/rtl/bls12_381/bls12_381_top.sv b/zcash_fpga/src/rtl/bls12_381/bls12_381_top.sv index 7b8043f..f677bd6 100644 --- a/zcash_fpga/src/rtl/bls12_381/bls12_381_top.sv +++ b/zcash_fpga/src/rtl/bls12_381/bls12_381_top.sv @@ -393,12 +393,12 @@ task get_next_inst(); if(inst_ram_read == 0) begin inst_ram_sys_if.a <= new_inst_pt_val_l ? new_inst_pt : inst_state == NOOP_WAIT ? inst_ram_sys_if.a : inst_ram_sys_if.a + 1; inst_ram_read[0] <= 1; + if (new_inst_pt_val_l) new_inst_pt_val_l <= 0; end if (inst_ram_read[READ_CYCLE]) begin inst_state <= curr_inst.code; cnt <= 0; end - new_inst_pt_val_l <= 0; endtask task task_copy_reg(); @@ -575,6 +575,7 @@ task task_send_interrupt(); case(cnt) inside // Load the data 0: begin + interrupt_in_if.eop <= 0; data_ram_sys_if.a <= curr_inst.a; if (interrupt_state != WAIT_FIFO) begin // Wait here @@ -601,10 +602,10 @@ task task_send_interrupt(); if (data_ram_read[READ_CYCLE]) begin pt_size <= pt_size - 1; interrupt_in_if.dat <= curr_data.dat; - if (pt_size == 1) interrupt_in_if.eop <= 1; interrupt_in_if.val <= 1; data_ram_sys_if.a <= data_ram_sys_if.a + 1; if (pt_size == 1) begin + interrupt_in_if.eop <= 1; cnt <= cnt + 1; end end diff --git a/zcash_fpga/src/tb/bls12_381_top_tb.sv b/zcash_fpga/src/tb/bls12_381_top_tb.sv index a957a3b..b3f65c3 100644 --- a/zcash_fpga/src/tb/bls12_381_top_tb.sv +++ b/zcash_fpga/src/tb/bls12_381_top_tb.sv @@ -63,46 +63,46 @@ begin jb_point_t out_p, exp_p; logic [DAT_BITS-1:0] in_k; bls12_381_interrupt_rpl_t interrupt_rpl; - + failed = 0; in_k = 381'haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; exp_p = point_mult(in_k, g_point); $display("Running test_fp_point_mult..."); - + axi_lite_if.peek(.addr(0), .data(rdata)); assert(rdata == INST_AXIL_START) else $fatal("ERROR: AXI lite register returned wrong value"); - + axi_lite_if.peek(.addr(4), .data(rdata)); assert(rdata == DATA_AXIL_START) else $fatal("ERROR: AXI lite register returned wrong value"); - + axi_lite_if.peek(.addr(8), .data(rdata)); assert(rdata == DATA_RAM_DEPTH*DATA_RAM_ALIGN_BYTE) else $fatal("ERROR: AXI lite register returned wrong value"); - + axi_lite_if.peek(.addr(12), .data(rdata)); assert(rdata == INST_RAM_DEPTH*INST_RAM_ALIGN_BYTE) else $fatal("ERROR: AXI lite register returned wrong value"); - + data = '{dat:in_k, pt:SCALAR}; axi_lite_if.put_data_multiple(.data(data), .addr(DATA_AXIL_START), .len(48)); - + inst = '{code:SEND_INTERRUPT, a:16'd1, b:16'hbeef, c:16'd0}; axi_lite_if.put_data_multiple(.data(inst), .addr(INST_AXIL_START + 8), .len(8)); - + // Write slot 0 to start inst = '{code:FP_FPOINT_MULT, a:16'd0, b:16'd1, c:16'd0}; axi_lite_if.put_data_multiple(.data(inst), .addr(INST_AXIL_START), .len(8)); - + fork begin out_if.get_stream(get_dat, get_len, 0); interrupt_rpl = get_dat; - + assert(interrupt_rpl.hdr.cmd == BLS12_381_INTERRUPT_RPL) else $fatal(1, "ERROR: Received non-interrupt message"); assert(interrupt_rpl.index == 16'hbeef) else $fatal(1, "ERROR: Received wrong index value in message"); assert(interrupt_rpl.data_type == FP_JB) else $fatal(1, "ERROR: Received wrong data type value in message"); - + get_dat = get_dat >> $bits(bls12_381_interrupt_rpl_t); - - for (int i = 0; i < 3; i++) + + for (int i = 0; i < 3; i++) out_p[i*381 +: 381] = get_dat[i*(48*8) +: 381]; if (out_p == exp_p) begin @@ -122,7 +122,7 @@ begin end join_any disable fork; - + axi_lite_if.peek(.addr(32'h14), .data(rdata)); $display("INFO: Last cycle count was %d", rdata); @@ -133,7 +133,90 @@ begin end endtask; +task test_fp2_point_mult(); +begin + integer signed get_len; + logic [common_pkg::MAX_SIM_BYTS*8-1:0] get_dat; + inst_t inst; + logic failed; + data_t data; + logic [31:0] rdata; + fp2_jb_point_t out_p, exp_p; + logic [DAT_BITS-1:0] in_k; + bls12_381_interrupt_rpl_t interrupt_rpl; + failed = 0; + in_k = 381'h33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333; + exp_p = fp2_point_mult(in_k, g2_point); + $display("Running test_fp2_point_mult..."); + + // See what current instruction pointer is + axi_lite_if.peek(.addr(32'h10), .data(rdata)); + + data = '{dat:in_k, pt:SCALAR}; + axi_lite_if.put_data_multiple(.data(data), .addr(DATA_AXIL_START + 64), .len(48)); // Scalar to multiply by goes in data slot 1 + + inst = '{code:SEND_INTERRUPT, a:16'd3, b:16'habcd, c:16'd0}; + axi_lite_if.put_data_multiple(.data(inst), .addr(INST_AXIL_START + (rdata+1)*8), .len(8)); + + // Write to current slot to start + inst = '{code:FP2_FPOINT_MULT, a:16'd1, b:16'd3, c:16'd0}; + axi_lite_if.put_data_multiple(.data(inst), .addr(INST_AXIL_START + (rdata)*8), .len(8)); + + fork + begin + out_if.get_stream(get_dat, get_len, 0); + interrupt_rpl = get_dat; + + assert(interrupt_rpl.hdr.cmd == BLS12_381_INTERRUPT_RPL) else $fatal(1, "ERROR: Received non-interrupt message"); + assert(interrupt_rpl.index == 16'habcd) else $fatal(1, "ERROR: Received wrong index value in message"); + assert(interrupt_rpl.data_type == FP2_JB) else $fatal(1, "ERROR: Received wrong data type value in message"); + + get_dat = get_dat >> $bits(bls12_381_interrupt_rpl_t); + + for (int i = 0; i < 6; i++) + out_p[i*381 +: 381] = get_dat[i*(48*8) +: 381]; + + if (out_p == exp_p) begin + $display("INFO: Output point matched expected:"); + print_fp2_jb_point(out_p); + end else begin + $display("ERROR: Output point did NOT match expected:"); + print_fp2_jb_point(out_p); + $display("Expected:"); + print_fp2_jb_point(exp_p); + failed = 1; + end + end + begin + repeat(100000) @(posedge out_if.i_clk); + $fatal("ERROR: Timeout while waiting for result"); + end + join_any + disable fork; + + axi_lite_if.peek(.addr(32'h14), .data(rdata)); + $display("INFO: Last cycle count was %d", rdata); + + // See what current instruction pointer is + axi_lite_if.peek(.addr(32'h10), .data(rdata)); + + $display("INFO: Current instruction pointer is 0x%x, setting to 0 and writing NULL instruction", rdata); + + inst = '{code:NOOP_WAIT, a:16'd0, b:16'h0, c:16'd0}; + axi_lite_if.put_data_multiple(.data(inst), .addr(INST_AXIL_START), .len(8)); + + axi_lite_if.poke(.addr(32'h10), .data(32'd0)); + repeat(10) @(posedge clk); + axi_lite_if.peek(.addr(32'h10), .data(rdata)); + assert(rdata == 32'd0) else $fatal(1, "ERROR: could not set instruction pointer"); + + if(failed) + $fatal(1, "ERROR: test_fp2_point_mult FAILED"); + else + $display("INFO: test_fp2_point_mult PASSED"); +end +endtask; initial begin axi_lite_if.reset_source(); @@ -145,6 +228,7 @@ initial begin @(posedge clk); test_fp_point_mult(); + test_fp2_point_mult(); #1us $finish(); end