1*90bc53b2SChris Fraire/* 2*90bc53b2SChris Fraire * MIT License 3*90bc53b2SChris Fraire * 4*90bc53b2SChris Fraire * Copyright (c) 2018 SCARV Project - <info@scarv.org> 5*90bc53b2SChris Fraire * 6*90bc53b2SChris Fraire * Permission is hereby granted, free of charge, to any person obtaining a copy 7*90bc53b2SChris Fraire * of this software and associated documentation files (the "Software"), to deal 8*90bc53b2SChris Fraire * in the Software without restriction, including without limitation the rights 9*90bc53b2SChris Fraire * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10*90bc53b2SChris Fraire * copies of the Software, and to permit persons to whom the Software is 11*90bc53b2SChris Fraire * furnished to do so, subject to the following conditions: 12*90bc53b2SChris Fraire * 13*90bc53b2SChris Fraire * The above copyright notice and this permission notice shall be included in all 14*90bc53b2SChris Fraire * copies or substantial portions of the Software. 15*90bc53b2SChris Fraire * 16*90bc53b2SChris Fraire * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*90bc53b2SChris Fraire * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*90bc53b2SChris Fraire * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*90bc53b2SChris Fraire * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*90bc53b2SChris Fraire * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21*90bc53b2SChris Fraire * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22*90bc53b2SChris Fraire * SOFTWARE. 23*90bc53b2SChris Fraire */ 24*90bc53b2SChris Fraire 25*90bc53b2SChris Fraire// 26*90bc53b2SChris Fraire// SCARV Project 27*90bc53b2SChris Fraire// 28*90bc53b2SChris Fraire// University of Bristol 29*90bc53b2SChris Fraire// 30*90bc53b2SChris Fraire// RISC-V Cryptographic Instruction Set Extension 31*90bc53b2SChris Fraire// 32*90bc53b2SChris Fraire// Reference Implementation 33*90bc53b2SChris Fraire// 34*90bc53b2SChris Fraire// 35*90bc53b2SChris Fraire 36*90bc53b2SChris Frairelocalparam \SCARV_COP_INSN_SUCCESS = 3'b000; 37*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_ABORT = 3'b001; 38*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_BAD_INS = 3'b010; 39*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_BAD_LAD = 3'b100; 40*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_BAD_SAD = 3'b101; 41*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_LD_ERR = 3'b110; 42*90bc53b2SChris Frairelocalparam SCARV_COP_INSN_ST_ERR = 3'b111; 43*90bc53b2SChris Frairelocalparam \module = 3'b111; 44*90bc53b2SChris Fraire 45*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_PACKED_ARITH = 4'b0001; 46*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_TWIDDLE = 4'b0010; 47*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_LOADSTORE = 4'b0011; 48*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_RANDOM = 4'b0100; 49*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_MOVE = 4'b0101; 50*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_MP = 4'b0110; 51*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_BITWISE = 4'b0111; 52*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_AES = 4'b1000; 53*90bc53b2SChris Frairelocalparam SCARV_COP_ICLASS_SHA3 = 4'b1001; 54*90bc53b2SChris Fraire 55*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SHA3_XY = 5'b11000; 56*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SHA3_X1 = 5'b11001; 57*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SHA3_X2 = 5'b11010; 58*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SHA3_X4 = 5'b11100; 59*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SHA3_YX = 5'b11011; 60*90bc53b2SChris Fraire 61*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SCATTER_B = 5'd0 ; 62*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_GATHER_B = 5'd1 ; 63*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_SCATTER_H = 5'd2 ; 64*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_GATHER_H = 5'd3 ; 65*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_ST_W = 5'd4 ; 66*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_LD_W = 5'd5 ; 67*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_ST_H = 5'd6 ; 68*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_LH_CR = 5'd7 ; 69*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_ST_B = 5'd8 ; 70*90bc53b2SChris Frairelocalparam SCARV_COP_SCLASS_LB_CR = 5'd9 ; 71*90bc53b2SChris Fraire 72*90bc53b2SChris Fraire`ifdef FORMAL 73*90bc53b2SChris Fraire`include "fml_common.vh" 74*90bc53b2SChris Fraire`endif 75*90bc53b2SChris Fraire 76*90bc53b2SChris Fraire// 77*90bc53b2SChris Fraire// module: scarv_cop_cprs 78*90bc53b2SChris Fraire// 79*90bc53b2SChris Fraire// The general purpose register file used by the COP. 80*90bc53b2SChris Fraire// 81*90bc53b2SChris Frairemodule scarv_cop_cprs ( 82*90bc53b2SChris Fraire 83*90bc53b2SChris Fraireinput wire g_clk , // Global clock 84*90bc53b2SChris Fraireoutput wire g_clk_req , // Clock request 85*90bc53b2SChris Fraireinput wire g_resetn , // Synchronous active low reset. 86*90bc53b2SChris Fraire 87*90bc53b2SChris Fraire`ifdef FORMAL 88*90bc53b2SChris Fraire`VTX_REGISTER_PORTS_OUT(cprs_snoop) 89*90bc53b2SChris Fraire`endif 90*90bc53b2SChris Fraire 91*90bc53b2SChris Fraireinput wire crs1_ren , // Port 1 read enable 92*90bc53b2SChris Fraireinput wire [ 3:0] crs1_addr , // Port 1 address 93*90bc53b2SChris Fraireoutput wire [31:0] crs1_rdata , // Port 1 read data 94*90bc53b2SChris Fraire 95*90bc53b2SChris Fraireinput wire crs2_ren , // Port 2 read enable 96*90bc53b2SChris Fraireinput wire [ 3:0] crs2_addr , // Port 2 address 97*90bc53b2SChris Fraireoutput wire [31:0] crs2_rdata , // Port 2 read data 98*90bc53b2SChris Fraire 99*90bc53b2SChris Fraireinput wire crs3_ren , // Port 3 read enable 100*90bc53b2SChris Fraireinput wire [ 3:0] crs3_addr , // Port 3 address 101*90bc53b2SChris Fraireoutput wire [31:0] crs3_rdata , // Port 3 read data 102*90bc53b2SChris Fraire 103*90bc53b2SChris Fraireinput wire [ 3:0] crd_wen , // Port 4 write enable 104*90bc53b2SChris Fraireinput wire [ 3:0] crd_addr , // Port 4 address 105*90bc53b2SChris Fraireinput wire [31:0] crd_wdata // Port 4 write data 106*90bc53b2SChris Fraire 107*90bc53b2SChris Fraire); 108*90bc53b2SChris Fraire 109*90bc53b2SChris Fraire// Only need a clock when doing a write. 110*90bc53b2SChris Fraireassign g_clk_req = crd_wen; 111*90bc53b2SChris Fraire 112*90bc53b2SChris Fraire// Storage for the registers 113*90bc53b2SChris Frairereg [31:0] cprs [15:0]; 114*90bc53b2SChris Fraire 115*90bc53b2SChris Fraire`ifdef FORMAL 116*90bc53b2SChris Fraire`VTX_REGISTER_PORTS_ASSIGNR(cprs_snoop,cprs) 117*90bc53b2SChris Fraire`endif 118*90bc53b2SChris Fraire 119*90bc53b2SChris Fraire// 120*90bc53b2SChris Fraire// Read port logic 121*90bc53b2SChris Fraire// 122*90bc53b2SChris Fraire 123*90bc53b2SChris Fraireassign crs1_rdata = {32{crs1_ren}} & cprs[crs1_addr]; 124*90bc53b2SChris Fraireassign crs2_rdata = {32{crs2_ren}} & cprs[crs2_addr]; 125*90bc53b2SChris Fraireassign crs3_rdata = {32{crs3_ren}} & cprs[crs3_addr]; 126*90bc53b2SChris Fraire 127*90bc53b2SChris Fraire// 128*90bc53b2SChris Fraire// Generate logic for each register. 129*90bc53b2SChris Fraire// 130*90bc53b2SChris Frairegenvar i; 131*90bc53b2SChris Frairegenerate for (i = 0; i < 16; i = i + 1) begin : gen_cprs 132*90bc53b2SChris Fraire 133*90bc53b2SChris Fraire always @(posedge g_clk) begin 134*90bc53b2SChris Fraire 135*90bc53b2SChris Fraire if(!g_resetn) begin 136*90bc53b2SChris Fraire `ifdef FORMAL 137*90bc53b2SChris Fraire // If running the yosys formal flow, allow initial 138*90bc53b2SChris Fraire // register values to be any constant value. 139*90bc53b2SChris Fraire #1 cprs[i] <= $anyconst; 140*90bc53b2SChris Fraire `else 141*90bc53b2SChris Fraire #1step cprs[i] <= 32'b0; 142*90bc53b2SChris Fraire `endif 143*90bc53b2SChris Fraire 144*90bc53b2SChris Fraire end else if((|crd_wen) && (crd_addr == i)) begin 145*90bc53b2SChris Fraire if(crd_wen[3]) cprs[i][31:24] <= crd_wdata[31:24]; 146*90bc53b2SChris Fraire if(crd_wen[2]) cprs[i][23:16] <= crd_wdata[23:16]; 147*90bc53b2SChris Fraire if(crd_wen[1]) cprs[i][15: 8] <= crd_wdata[15: 8]; 148*90bc53b2SChris Fraire if(crd_wen[0]) cprs[i][ 7: 0] <= crd_wdata[ 7: 0]; 149*90bc53b2SChris Fraire end 150*90bc53b2SChris Fraire 151*90bc53b2SChris Fraire end 152*90bc53b2SChris Fraire 153*90bc53b2SChris Fraireend endgenerate 154*90bc53b2SChris Fraire 155*90bc53b2SChris Fraireendmodule 156