blob: cd5a22ec7f5f7abbb38e7cf72bc64f51cb15475d [file] [log] [blame]
//_\TLV_version 1d: tl-x.org, generated by SandPiper(TM) 1.11-2021/01/28-beta
`include "sp_verilog.vh" //_\SV
// Included URL: "https://raw.githubusercontent.com/shivanishah269/risc-v-core/master/FPGA_Implementation/riscv_shell_lib.tlv"// Included URL: "https://raw.githubusercontent.com/stevehoover/warp-v_includes/2d6d36baa4d2bc62321f982f78c8fe1456641a43/risc-v_defs.tlv"
module rvmyth(
output reg [9:0] OUT,
input CLK,
input reset
);
wire clk = CLK;
`include "rvmyth_gen.v"
generate //_\TLV
//
// Inst #0: ADDI,r9,r0,1
// Inst #1: ADDI,r10,r0,101011
// Inst #2: ADDI,r11,r0,0
// Inst #3: ADDI,r17,r0,0
// Inst #4: ADD,r17,r17,r11
// Inst #5: ADDI,r11,r11,1
// Inst #6: BNE,r11,r10,1111111111000
// Inst #7: ADD,r17,r17,r11
// Inst #8: SUB,r17,r17,r11
// Inst #9: SUB,r11,r11,r9
// Inst #10: BNE,r11,r9,1111111111000
// Inst #11: SUB,r17,r17,r11
// Inst #12: BEQ,r0,r0,1111111100000
//
//
//_|cpu
//_@0
assign CPU_reset_a0 = reset;
//Fetch
// Next PC
assign CPU_pc_a0[31:0] = (CPU_reset_a1) ? 32'd0 :
(CPU_valid_taken_br_a3) ? CPU_br_tgt_pc_a3 :
(CPU_valid_load_a3) ? CPU_inc_pc_a3 :
(CPU_valid_jump_a3 && CPU_is_jal_a3) ? CPU_br_tgt_pc_a3 :
(CPU_valid_jump_a3 && CPU_is_jalr_a3) ? CPU_jalr_tgt_pc_a3 : CPU_inc_pc_a1;
assign CPU_imem_rd_en_a0 = !CPU_reset_a0;
assign CPU_imem_rd_addr_a0[31:0] = CPU_pc_a0[4+1:2];
//_@1
assign CPU_instr_a1[31:0] = CPU_imem_rd_data_a1[31:0];
assign CPU_inc_pc_a1[31:0] = CPU_pc_a1 + 32'd4;
// Decode
assign CPU_is_i_instr_a1 = CPU_instr_a1[6:2] == 5'b00000 ||
CPU_instr_a1[6:2] == 5'b00001 ||
CPU_instr_a1[6:2] == 5'b00100 ||
CPU_instr_a1[6:2] == 5'b00110 ||
CPU_instr_a1[6:2] == 5'b11001;
assign CPU_is_r_instr_a1 = CPU_instr_a1[6:2] == 5'b01011 ||
CPU_instr_a1[6:2] == 5'b10100 ||
CPU_instr_a1[6:2] == 5'b01100 ||
CPU_instr_a1[6:2] == 5'b01101;
assign CPU_is_b_instr_a1 = CPU_instr_a1[6:2] == 5'b11000;
assign CPU_is_u_instr_a1 = CPU_instr_a1[6:2] == 5'b00101 ||
CPU_instr_a1[6:2] == 5'b01101;
assign CPU_is_s_instr_a1 = CPU_instr_a1[6:2] == 5'b01000 ||
CPU_instr_a1[6:2] == 5'b01001;
assign CPU_is_j_instr_a1 = CPU_instr_a1[6:2] == 5'b11011;
assign CPU_imm_a1[31:0] = CPU_is_i_instr_a1 ? { {21{CPU_instr_a1[31]}} , CPU_instr_a1[30:20] } :
CPU_is_s_instr_a1 ? { {21{CPU_instr_a1[31]}} , CPU_instr_a1[30:25] , CPU_instr_a1[11:8] , CPU_instr_a1[7] } :
CPU_is_b_instr_a1 ? { {20{CPU_instr_a1[31]}} , CPU_instr_a1[7] , CPU_instr_a1[30:25] , CPU_instr_a1[11:8] , 1'b0} :
CPU_is_u_instr_a1 ? { CPU_instr_a1[31:12] , 12'b0} :
CPU_is_j_instr_a1 ? { {12{CPU_instr_a1[31]}} , CPU_instr_a1[19:12] , CPU_instr_a1[20] , CPU_instr_a1[30:21] , 1'b0} : 32'b0;
assign CPU_rs2_valid_a1 = CPU_is_r_instr_a1 || CPU_is_s_instr_a1 || CPU_is_b_instr_a1;
assign CPU_rs1_valid_a1 = CPU_is_r_instr_a1 || CPU_is_s_instr_a1 || CPU_is_b_instr_a1 || CPU_is_i_instr_a1;
assign CPU_rd_valid_a1 = CPU_is_r_instr_a1 || CPU_is_i_instr_a1 || CPU_is_u_instr_a1 || CPU_is_j_instr_a1;
assign CPU_funct3_valid_a1 = CPU_is_r_instr_a1 || CPU_is_s_instr_a1 || CPU_is_b_instr_a1 || CPU_is_i_instr_a1;
assign CPU_funct7_valid_a1 = CPU_is_r_instr_a1;
//_?$rs2_valid
assign CPU_rs2_a1[4:0] = CPU_instr_a1[24:20];
//_?$rs1_valid
assign CPU_rs1_a1[4:0] = CPU_instr_a1[19:15];
//_?$rd_valid
assign CPU_rd_a1[4:0] = CPU_instr_a1[11:7];
//_?$funct3_valid
assign CPU_funct3_a1[2:0] = CPU_instr_a1[14:12];
//_?$funct7_valid
assign CPU_funct7_a1[6:0] = CPU_instr_a1[31:25];
assign CPU_opcode_a1[6:0] = CPU_instr_a1[6:0];
assign CPU_dec_bits_a1[10:0] = {CPU_funct7_a1[5],CPU_funct3_a1,CPU_opcode_a1};
// Branch Instruction
assign CPU_is_beq_a1 = CPU_dec_bits_a1[9:0] == 10'b000_1100011;
assign CPU_is_bne_a1 = CPU_dec_bits_a1[9:0] == 10'b001_1100011;
assign CPU_is_blt_a1 = CPU_dec_bits_a1[9:0] == 10'b100_1100011;
assign CPU_is_bge_a1 = CPU_dec_bits_a1[9:0] == 10'b101_1100011;
assign CPU_is_bltu_a1 = CPU_dec_bits_a1[9:0] == 10'b110_1100011;
assign CPU_is_bgeu_a1 = CPU_dec_bits_a1[9:0] == 10'b111_1100011;
// Arithmetic Instruction
assign CPU_is_add_a1 = CPU_dec_bits_a1 == 11'b0_000_0110011;
assign CPU_is_addi_a1 = CPU_dec_bits_a1[9:0] == 10'b000_0010011;
assign CPU_is_or_a1 = CPU_dec_bits_a1 == 11'b0_110_0110011;
assign CPU_is_ori_a1 = CPU_dec_bits_a1[9:0] == 10'b110_0010011;
assign CPU_is_xor_a1 = CPU_dec_bits_a1 == 11'b0_100_0110011;
assign CPU_is_xori_a1 = CPU_dec_bits_a1[9:0] == 10'b100_0010011;
assign CPU_is_and_a1 = CPU_dec_bits_a1 == 11'b0_111_0110011;
assign CPU_is_andi_a1 = CPU_dec_bits_a1[9:0] == 10'b111_0010011;
assign CPU_is_sub_a1 = CPU_dec_bits_a1 == 11'b1_000_0110011;
assign CPU_is_slti_a1 = CPU_dec_bits_a1[9:0] == 10'b010_0010011;
assign CPU_is_sltiu_a1 = CPU_dec_bits_a1[9:0] == 10'b011_0010011;
assign CPU_is_slli_a1 = CPU_dec_bits_a1 == 11'b0_001_0010011;
assign CPU_is_srli_a1 = CPU_dec_bits_a1 == 11'b0_101_0010011;
assign CPU_is_srai_a1 = CPU_dec_bits_a1 == 11'b1_101_0010011;
assign CPU_is_sll_a1 = CPU_dec_bits_a1 == 11'b0_001_0110011;
assign CPU_is_slt_a1 = CPU_dec_bits_a1 == 11'b0_010_0110011;
assign CPU_is_sltu_a1 = CPU_dec_bits_a1 == 11'b0_011_0110011;
assign CPU_is_srl_a1 = CPU_dec_bits_a1 == 11'b0_101_0110011;
assign CPU_is_sra_a1 = CPU_dec_bits_a1 == 11'b1_101_0110011;
// Load Instruction
assign CPU_is_load_a1 = CPU_dec_bits_a1[6:0] == 7'b0000011;
// Store Instruction
assign CPU_is_sb_a1 = CPU_dec_bits_a1[9:0] == 10'b000_0100011;
assign CPU_is_sh_a1 = CPU_dec_bits_a1[9:0] == 10'b001_0100011;
assign CPU_is_sw_a1 = CPU_dec_bits_a1[9:0] == 10'b010_0100011;
// Jump Instruction
assign CPU_is_lui_a1 = CPU_dec_bits_a1[6:0] == 7'b0110111;
assign CPU_is_auipc_a1 = CPU_dec_bits_a1[6:0] == 7'b0010111;
assign CPU_is_jal_a1 = CPU_dec_bits_a1[6:0] == 7'b1101111;
assign CPU_is_jalr_a1 = CPU_dec_bits_a1[9:0] == 10'b000_1100111;
assign CPU_is_jump_a1 = CPU_is_jal_a1 || CPU_is_jalr_a1;
//_@2
// Register File Read
assign CPU_rf_rd_en1_a2 = CPU_rs1_valid_a2;
//_?$rf_rd_en1
assign CPU_rf_rd_index1_a2[4:0] = CPU_rs1_a2[4:0];
assign CPU_rf_rd_en2_a2 = CPU_rs2_valid_a2;
//_?$rf_rd_en2
assign CPU_rf_rd_index2_a2[4:0] = CPU_rs2_a2[4:0];
// Branch Target PC
assign CPU_br_tgt_pc_a2[31:0] = CPU_pc_a2 + CPU_imm_a2;
// Jump Target PC
assign CPU_jalr_tgt_pc_a2[31:0] = CPU_src1_value_a2 + CPU_imm_a2;
// Input signals to ALU
assign CPU_src1_value_a2[31:0] = ((CPU_rd_a3 == CPU_rs1_a2) && CPU_rf_wr_en_a3) ? CPU_result_a3 : CPU_rf_rd_data1_a2[31:0];
assign CPU_src2_value_a2[31:0] = ((CPU_rd_a3 == CPU_rs2_a2) && CPU_rf_wr_en_a3) ? CPU_result_a3 : CPU_rf_rd_data2_a2[31:0];
//_@3
// ALU
assign CPU_sltu_result_a3 = CPU_src1_value_a3 < CPU_src2_value_a3 ;
assign CPU_sltiu_result_a3 = CPU_src1_value_a3 < CPU_imm_a3 ;
assign CPU_result_a3[31:0] = CPU_is_addi_a3 ? CPU_src1_value_a3 + CPU_imm_a3 :
CPU_is_add_a3 ? CPU_src1_value_a3 + CPU_src2_value_a3 :
CPU_is_or_a3 ? CPU_src1_value_a3 | CPU_src2_value_a3 :
CPU_is_ori_a3 ? CPU_src1_value_a3 | CPU_imm_a3 :
CPU_is_xor_a3 ? CPU_src1_value_a3 ^ CPU_src2_value_a3 :
CPU_is_xori_a3 ? CPU_src1_value_a3 ^ CPU_imm_a3 :
CPU_is_and_a3 ? CPU_src1_value_a3 & CPU_src2_value_a3 :
CPU_is_andi_a3 ? CPU_src1_value_a3 & CPU_imm_a3 :
CPU_is_sub_a3 ? CPU_src1_value_a3 - CPU_src2_value_a3 :
CPU_is_slti_a3 ? ((CPU_src1_value_a3[31] == CPU_imm_a3[31]) ? CPU_sltiu_result_a3 : {31'b0,CPU_src1_value_a3[31]}) :
CPU_is_sltiu_a3 ? CPU_sltiu_result_a3 :
CPU_is_slli_a3 ? CPU_src1_value_a3 << CPU_imm_a3[5:0] :
CPU_is_srli_a3 ? CPU_src1_value_a3 >> CPU_imm_a3[5:0] :
CPU_is_srai_a3 ? ({{32{CPU_src1_value_a3[31]}}, CPU_src1_value_a3} >> CPU_imm_a3[4:0]) :
CPU_is_sll_a3 ? CPU_src1_value_a3 << CPU_src2_value_a3[4:0] :
CPU_is_slt_a3 ? ((CPU_src1_value_a3[31] == CPU_src2_value_a3[31]) ? CPU_sltu_result_a3 : {31'b0,CPU_src1_value_a3[31]}) :
CPU_is_sltu_a3 ? CPU_sltu_result_a3 :
CPU_is_srl_a3 ? CPU_src1_value_a3 >> CPU_src2_value_a3[5:0] :
CPU_is_sra_a3 ? ({{32{CPU_src1_value_a3[31]}}, CPU_src1_value_a3} >> CPU_src2_value_a3[4:0]) :
CPU_is_lui_a3 ? ({CPU_imm_a3[31:12], 12'b0}) :
CPU_is_auipc_a3 ? CPU_pc_a3 + CPU_imm_a3 :
CPU_is_jal_a3 ? CPU_pc_a3 + 4 :
CPU_is_jalr_a3 ? CPU_pc_a3 + 4 :
(CPU_is_load_a3 || CPU_is_s_instr_a3) ? CPU_src1_value_a3 + CPU_imm_a3 : 32'bx;
// Register File Write
assign CPU_rf_wr_en_a3 = (CPU_rd_valid_a3 && CPU_valid_a3 && CPU_rd_a3 != 5'b0) || CPU_valid_load_a5;
//_?$rf_wr_en
assign CPU_rf_wr_index_a3[4:0] = !CPU_valid_a3 ? CPU_rd_a5[4:0] : CPU_rd_a3[4:0];
assign CPU_rf_wr_data_a3[31:0] = !CPU_valid_a3 ? CPU_ld_data_a5[31:0] : CPU_result_a3[31:0];
// Branch
assign CPU_taken_br_a3 = CPU_is_beq_a3 ? (CPU_src1_value_a3 == CPU_src2_value_a3) :
CPU_is_bne_a3 ? (CPU_src1_value_a3 != CPU_src2_value_a3) :
CPU_is_blt_a3 ? ((CPU_src1_value_a3 < CPU_src2_value_a3) ^ (CPU_src1_value_a3[31] != CPU_src2_value_a3[31])) :
CPU_is_bge_a3 ? ((CPU_src1_value_a3 >= CPU_src2_value_a3) ^ (CPU_src1_value_a3[31] != CPU_src2_value_a3[31])) :
CPU_is_bltu_a3 ? (CPU_src1_value_a3 < CPU_src2_value_a3) :
CPU_is_bgeu_a3 ? (CPU_src1_value_a3 >= CPU_src2_value_a3) : 1'b0;
assign CPU_valid_taken_br_a3 = CPU_valid_a3 && CPU_taken_br_a3;
// Load
assign CPU_valid_load_a3 = CPU_valid_a3 && CPU_is_load_a3;
assign CPU_valid_a3 = !(CPU_valid_taken_br_a4 || CPU_valid_taken_br_a5 || CPU_valid_load_a4 || CPU_valid_load_a5 || CPU_valid_jump_a4 || CPU_valid_jump_a5);
// Jump
assign CPU_valid_jump_a3 = CPU_valid_a3 && CPU_is_jump_a3;
//_@4
assign CPU_dmem_rd_en_a4 = CPU_valid_load_a4;
assign CPU_dmem_wr_en_a4 = CPU_valid_a4 && CPU_is_s_instr_a4;
assign CPU_dmem_addr_a4[3:0] = CPU_result_a4[5:2];
assign CPU_dmem_wr_data_a4[31:0] = CPU_src2_value_a4[31:0];
//_@5
assign CPU_ld_data_a5[31:0] = CPU_dmem_rd_data_a5[31:0];
// Note: Because of the magic we are using for visualisation, if visualisation is enabled below,
// be sure to avoid having unassigned signals (which you might be using for random inputs)
// other than those specifically expected in the labs. You'll get strange errors for these.
`BOGUS_USE(CPU_is_beq_a5 CPU_is_bne_a5 CPU_is_blt_a5 CPU_is_bge_a5 CPU_is_bltu_a5 CPU_is_bgeu_a5)
`BOGUS_USE(CPU_is_sb_a5 CPU_is_sh_a5 CPU_is_sw_a5)
// Assert these to end simulation (before Makerchip cycle limit).
/*SV_plus*/
always @ (posedge CLK) begin
OUT = CPU_Xreg_value_a5[17];
end
// Macro instantiations for:
// o instruction memory
// o register file
// o data memory
// o CPU visualization
//_|cpu
//_\source /raw.githubusercontent.com/shivanishah269/riscvcore/master/FPGAImplementation/riscvshelllib.tlv 16 // Instantiated from rvmyth.tlv, 243 as: m4+imem(@1)
// Instruction Memory containing program defined by m4_asm(...) instantiations.
//_@1
/*SV_plus*/
// The program in an instruction memory.
wire [31:0] instrs [0:13-1];
assign instrs[0] = {12'b1, 5'd0, 3'b000, 5'd9, 7'b0010011};
assign instrs[1] = {12'b101011, 5'd0, 3'b000, 5'd10, 7'b0010011};
assign instrs[2] = {12'b0, 5'd0, 3'b000, 5'd11, 7'b0010011};
assign instrs[3] = {12'b0, 5'd0, 3'b000, 5'd17, 7'b0010011};
assign instrs[4] = {7'b0000000, 5'd11, 5'd17, 3'b000, 5'd17, 7'b0110011};
assign instrs[5] = {12'b1, 5'd11, 3'b000, 5'd11, 7'b0010011};
assign instrs[6] = {1'b1, 6'b111111, 5'd10, 5'd11, 3'b001, 4'b1100, 1'b1, 7'b1100011};
assign instrs[7] = {7'b0000000, 5'd11, 5'd17, 3'b000, 5'd17, 7'b0110011};
assign instrs[8] = {7'b0100000, 5'd11, 5'd17, 3'b000, 5'd17, 7'b0110011};
assign instrs[9] = {7'b0100000, 5'd9, 5'd11, 3'b000, 5'd11, 7'b0110011};
assign instrs[10] = {1'b1, 6'b111111, 5'd9, 5'd11, 3'b001, 4'b1100, 1'b1, 7'b1100011};
assign instrs[11] = {7'b0100000, 5'd11, 5'd17, 3'b000, 5'd17, 7'b0110011};
assign instrs[12] = {1'b1, 6'b111111, 5'd0, 5'd0, 3'b000, 4'b0000, 1'b1, 7'b1100011};
for (imem = 0; imem <= 12; imem=imem+1) begin : L1_CPU_Imem //_/imem
assign CPU_Imem_instr_a1[imem][31:0] = instrs[imem];
end
//_?$imem_rd_en
assign CPU_imem_rd_data_a1[31:0] = CPU_imem_rd_addr_a1 < 13 ? CPU_Imem_instr_a1[CPU_imem_rd_addr_a1] : 32'b0;
//_\end_source // Args: (read stage)
//_\source /raw.githubusercontent.com/shivanishah269/riscvcore/master/FPGAImplementation/riscvshelllib.tlv 31 // Instantiated from rvmyth.tlv, 244 as: m4+rf(@2, @3)
// Reg File
//_@3
for (xreg = 0; xreg <= 31; xreg=xreg+1) begin : L1_CPU_Xreg //_/xreg
// For $wr.
wire L1_wr_a3;
assign L1_wr_a3 = CPU_rf_wr_en_a3 && (CPU_rf_wr_index_a3 != 5'b0) && (CPU_rf_wr_index_a3 == xreg);
assign CPU_Xreg_value_a3[xreg][31:0] = CPU_reset_a3 ? xreg :
L1_wr_a3 ? CPU_rf_wr_data_a3 :
CPU_Xreg_value_a4[xreg][31:0];
end
//_@2
//_?$rf_rd_en1
assign CPU_rf_rd_data1_a2[31:0] = CPU_Xreg_value_a4[CPU_rf_rd_index1_a2];
//_?$rf_rd_en2
assign CPU_rf_rd_data2_a2[31:0] = CPU_Xreg_value_a4[CPU_rf_rd_index2_a2];
`BOGUS_USE(CPU_rf_rd_data1_a2 CPU_rf_rd_data2_a2)
//_\end_source // Args: (read stage, write stage) - if equal, no register bypass is required
//_\source /raw.githubusercontent.com/shivanishah269/riscvcore/master/FPGAImplementation/riscvshelllib.tlv 48 // Instantiated from rvmyth.tlv, 245 as: m4+dmem(@4)
// Data Memory
//_@4
for (dmem = 0; dmem <= 15; dmem=dmem+1) begin : L1_CPU_Dmem //_/dmem
// For $wr.
wire L1_wr_a4;
assign L1_wr_a4 = CPU_dmem_wr_en_a4 && (CPU_dmem_addr_a4 == dmem);
assign CPU_Dmem_value_a4[dmem][31:0] = CPU_reset_a4 ? dmem :
L1_wr_a4 ? CPU_dmem_wr_data_a4 :
CPU_Dmem_value_a5[dmem][31:0];
end
//_?$dmem_rd_en
assign CPU_dmem_rd_data_a4[31:0] = CPU_Dmem_value_a5[CPU_dmem_addr_a4];
//`BOGUS_USE($dmem_rd_data)
//_\end_source // Args: (read/write stage)
endgenerate
//_\SV
endmodule