xref: /OpenGrok/opengrok-indexer/src/test/resources/analysis/verilog/sample.v (revision 90bc53b203c86690bfae104de12c1aedea1161dd)
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