diff --git a/rtl/VX_define.v b/rtl/VX_define.v index b40567f8..809ff759 100644 --- a/rtl/VX_define.v +++ b/rtl/VX_define.v @@ -12,7 +12,7 @@ // `define SYN 1 // `define ASIC 1 -// `define SYN_FUNC 1 +`define SYN_FUNC 1 `define NUM_BARRIERS 4 diff --git a/rtl/VX_gpr_stage.v b/rtl/VX_gpr_stage.v index 89316cbb..3d556a83 100644 --- a/rtl/VX_gpr_stage.v +++ b/rtl/VX_gpr_stage.v @@ -116,7 +116,7 @@ module VX_gpr_stage ( wire store_curr_real = !delayed_lsu_last_cycle && stall_lsu; - VX_generic_register #(.N(256)) lsu_data( + VX_generic_register #(.N(`NT*32*2)) lsu_data( .clk (clk), .reset(reset), .stall(!store_curr_real), @@ -133,7 +133,7 @@ module VX_gpr_stage ( assign VX_lsu_req.base_address = (delayed_lsu_last_cycle) ? temp_base_address : real_base_address; - VX_generic_register #(.N(77 + `NW_M1 + 65*(1 + `NT))) lsu_reg( + VX_generic_register #(.N(77 + `NW_M1 + 1 + (`NT))) lsu_reg( .clk (clk), .reset(reset), .stall(stall_lsu), @@ -142,7 +142,7 @@ module VX_gpr_stage ( .out ({VX_lsu_req.valid , VX_lsu_req.lsu_pc ,VX_lsu_req.warp_num , VX_lsu_req.offset , VX_lsu_req.mem_read , VX_lsu_req.mem_write , VX_lsu_req.rd , VX_lsu_req.wb }) ); - VX_generic_register #(.N(224 + `NW_M1 + 1 + 65*(`NT))) exec_unit_reg( + VX_generic_register #(.N(224 + `NW_M1 + 1 + (`NT))) exec_unit_reg( .clk (clk), .reset(reset), .stall(stall_rest), @@ -154,7 +154,7 @@ module VX_gpr_stage ( assign VX_exec_unit_req.a_reg_data = real_base_address; assign VX_exec_unit_req.b_reg_data = real_store_data; - VX_generic_register #(.N(68 + `NW_M1 + 1 + 33*(`NT))) gpu_inst_reg( + VX_generic_register #(.N(36 + `NW_M1 + 1 + (`NT))) gpu_inst_reg( .clk (clk), .reset(reset), .stall(stall_rest), diff --git a/sftp-config.json b/sftp-config.json index 01f84e46..80316a7e 100644 --- a/sftp-config.json +++ b/sftp-config.json @@ -5,13 +5,13 @@ // sftp, ftp or ftps "type": "sftp", - "save_before_upload": true, - "upload_on_save": true, + "save_before_upload": false, + "upload_on_save": false, "sync_down_on_open": false, "sync_skip_deletes": false, - "sync_same_age": true, + "sync_same_age": false, "confirm_downloads": false, - "confirm_sync": true, + "confirm_sync": false, "confirm_overwrite_newer": false, "host": "ece-rschsrv01.ece.gatech.edu", diff --git a/simX/enc.cpp b/simX/enc.cpp index 16007652..09a3253c 100644 --- a/simX/enc.cpp +++ b/simX/enc.cpp @@ -219,7 +219,13 @@ Instruction *WordDecoder::decode(const std::vector &v, Size &idx, trace_in imeed = 0 | (bits_10_1 << 1) | (bit_11 << 11) | (bits_19_12 << 12) | (bit_20 << 20); - inst.setSrcImm(signExt(imeed, 20, j_immed_mask)); + if (bit_20) + { + imeed |= ~j_immed_mask; + } + + // inst.setSrcImm(signExt(imeed, 20, j_immed_mask)); + inst.setSrcImm(imeed); usedImm = true; trace_inst->valid_inst = true; diff --git a/simX/instruction.cpp b/simX/instruction.cpp index 4da4272e..12166f32 100644 --- a/simX/instruction.cpp +++ b/simX/instruction.cpp @@ -1507,6 +1507,8 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { break; case 2: { + Word VLMAX = (c.vtype.vlmul * c.VLEN)/c.vtype.vsew; + switch(func6){ case 24: //vmandnot { @@ -1526,6 +1528,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t * result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } + for(uint8_t i = c.vl; i < VLMAX; i++){ + uint8_t *result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } + } else if(c.vtype.vsew == 16) { for(uint16_t i = 0; i < c.vl; i++){ @@ -1539,6 +1546,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t * result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } + } else if(c.vtype.vsew == 32) { for(uint32_t i = 0; i < c.vl; i++){ @@ -1552,6 +1564,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t * result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } + } } break; @@ -1573,6 +1590,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t * result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } + for(uint8_t i = c.vl; i < VLMAX; i++){ + uint8_t *result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 16) { for(uint16_t i = 0; i < c.vl; i++){ @@ -1587,6 +1608,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } + } else if(c.vtype.vsew == 32) { for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; @@ -1599,6 +1625,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t * result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } } } break; @@ -1620,7 +1651,13 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t * result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } + for(uint8_t i = c.vl; i < VLMAX; i++){ + uint8_t *result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } + } else if(c.vtype.vsew == 16) { + uint16_t *result_ptr; for(uint16_t i = 0; i < c.vl; i++){ uint16_t *first_ptr = (uint16_t *)vr1[i].val; uint16_t *second_ptr = (uint16_t *)vr2[i].val; @@ -1629,11 +1666,15 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t result = (first_value | second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint16_t * result_ptr = (uint16_t *) vd[i].val; + result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } - + for(uint16_t i = c.vl; i < VLMAX; i++){ + result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 32) { + uint32_t *result_ptr; for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; uint32_t *second_ptr = (uint32_t *)vr2[i].val; @@ -1642,9 +1683,14 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t result = (first_value | second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint32_t * result_ptr = (uint32_t *) vd[i].val; + result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + cout << "VLMAX: " << VLMAX << endl; + for(Word i = c.vl; i < VLMAX; i++){ + result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } } } break; @@ -1655,6 +1701,7 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { vector> vr2 = c.vreg[rsrc[1]]; vector> vd = c.vreg[rdest]; if(c.vtype.vsew == 8){ + uint8_t *result_ptr; for(uint8_t i = 0; i < c.vl; i++){ uint8_t *first_ptr = (uint8_t *)vr1[i].val; uint8_t *second_ptr = (uint8_t *)vr2[i].val; @@ -1662,12 +1709,15 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t second_value = (*second_ptr & 0x1); uint8_t result = (first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - - uint8_t * result_ptr = (uint8_t *) vd[i].val; + result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } - + for(uint8_t i = c.vl; i < VLMAX; i++){ + result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 16) { + uint16_t *result_ptr; for(uint16_t i = 0; i < c.vl; i++){ uint16_t *first_ptr = (uint16_t *)vr1[i].val; uint16_t *second_ptr = (uint16_t *)vr2[i].val; @@ -1676,11 +1726,17 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t result = (first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint16_t * result_ptr = (uint16_t *) vd[i].val; + result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 32) { + uint32_t *result_ptr; + for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; uint32_t *second_ptr = (uint32_t *)vr2[i].val; @@ -1689,9 +1745,13 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t result = (first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint32_t * result_ptr = (uint32_t *) vd[i].val; + result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } } } break; @@ -1713,7 +1773,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t * result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } - + for(uint8_t i = c.vl; i < VLMAX; i++){ + uint8_t *result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 16) { for(uint16_t i = 0; i < c.vl; i++){ uint16_t *first_ptr = (uint16_t *)vr1[i].val; @@ -1726,6 +1789,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t * result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 32) { for(uint32_t i = 0; i < c.vl; i++){ @@ -1739,6 +1806,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t * result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } } } break; @@ -1760,6 +1831,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t * result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } + for(uint8_t i = c.vl; i < VLMAX; i++){ + uint8_t *result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 16) { for(uint16_t i = 0; i < c.vl; i++){ @@ -1774,6 +1849,11 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } + } else if(c.vtype.vsew == 32) { for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; @@ -1786,6 +1866,12 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t * result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } + } } break; @@ -1796,6 +1882,8 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { vector> vr2 = c.vreg[rsrc[1]]; vector> vd = c.vreg[rdest]; if(c.vtype.vsew == 8){ + uint8_t *result_ptr; + for(uint8_t i = 0; i < c.vl; i++){ uint8_t *first_ptr = (uint8_t *)vr1[i].val; uint8_t *second_ptr = (uint8_t *)vr2[i].val; @@ -1804,10 +1892,13 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t result = !(first_value | second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint8_t * result_ptr = (uint8_t *) vd[i].val; + result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } - + for(uint8_t i = c.vl; i < VLMAX; i++){ + result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 16) { for(uint16_t i = 0; i < c.vl; i++){ uint16_t *first_ptr = (uint16_t *)vr1[i].val; @@ -1820,8 +1911,13 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t * result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + uint16_t *result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 32) { + for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; uint32_t *second_ptr = (uint32_t *)vr2[i].val; @@ -1833,12 +1929,19 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t * result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + for(Word i = c.vl; i < VLMAX; i++){ + uint32_t *result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } + } } break; case 31: //vmxnor { D(3, "vmxnor"); + uint8_t *result_ptr; + vector> vr1 = c.vreg[rsrc[0]]; vector> vr2 = c.vreg[rsrc[1]]; vector> vd = c.vreg[rdest]; @@ -1851,11 +1954,16 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint8_t result = !(first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint8_t * result_ptr = (uint8_t *) vd[i].val; + result_ptr = (uint8_t *) vd[i].val; *result_ptr = result; } - - } else if(c.vtype.vsew == 16) { + for(uint8_t i = c.vl; i < VLMAX; i++){ + result_ptr = (uint8_t *) vd[i].val; + *result_ptr = 0; + } + } + else if(c.vtype.vsew == 16) { + uint16_t *result_ptr; for(uint16_t i = 0; i < c.vl; i++){ uint16_t *first_ptr = (uint16_t *)vr1[i].val; uint16_t *second_ptr = (uint16_t *)vr2[i].val; @@ -1864,11 +1972,17 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint16_t result = !(first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint16_t * result_ptr = (uint16_t *) vd[i].val; + result_ptr = (uint16_t *) vd[i].val; *result_ptr = result; } + for(uint16_t i = c.vl; i < VLMAX; i++){ + result_ptr = (uint16_t *) vd[i].val; + *result_ptr = 0; + } } else if(c.vtype.vsew == 32) { + uint32_t *result_ptr; + for(uint32_t i = 0; i < c.vl; i++){ uint32_t *first_ptr = (uint32_t *)vr1[i].val; uint32_t *second_ptr = (uint32_t *)vr2[i].val; @@ -1877,9 +1991,14 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { uint32_t result = !(first_value ^ second_value); cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n'; - uint32_t * result_ptr = (uint32_t *) vd[i].val; + result_ptr = (uint32_t *) vd[i].val; *result_ptr = result; } + for(Word i = c.vl; i < VLMAX; i++){ + result_ptr = (uint32_t *) vd[i].val; + *result_ptr = 0; + } + } } break; @@ -1944,10 +2063,10 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) { //trace_inst->is_lw = true; //trace_inst->mem_addresses[t] = memAddr; } - for(Word i = c.vl; i < VLMAX; i++){ + /*for(Word i = c.vl; i < VLMAX; i++){ int * result_ptr = (int *) vd[i].val; *result_ptr = 0; - } + }*/ D(3, "Vector Register state after addition:"); for(int i=0; i < c.vreg.size(); i++) diff --git a/syn/run_mult_synth.sh b/syn/run_mult_synth.sh index 81509aa7..38a32f9a 100644 --- a/syn/run_mult_synth.sh +++ b/syn/run_mult_synth.sh @@ -11,7 +11,7 @@ for number_of_warps in 2 4 8 16 32; do echo "Warp Count: $number_of_warps Thread Count: $number_of_threads Launched" echo "\`define NT $number_of_threads" > ../rtl/VX_define_synth.v echo "\`define NW $number_of_warps" >> ../rtl/VX_define_synth.v - make dc | tee run.log + make dc | tee run.log 1>/dev/null sleep 30 moved_filename="${number_of_warps}_Warps__${number_of_threads}_threads__400MHz.log" mv ./vortex_syn.log ../../$moved_filename