1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
// DESCRIPTION: Verilator: Verilog Test module
//
// Copyright 2010 by Wilson Snyder. This program is free software; you can
// redistribute it and/or modify it under the terms of either the GNU
// Lesser General Public License Version 3 or the Perl Artistic License
// Version 2.0.
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
/* verilator public_on */
typedef struct packed {
logic [3:0][7:0] adr; // address
logic [3:0][7:0] dat; // data
int sel; // select
} t_bus;
interface TestInterface();
logic [31:0] addr;
modport source (input addr);
endinterface
module t ( /*AUTOARG*/
// Outputs
x,
// Inputs
clk,
a
);
parameter int do_generate = 1;
parameter longint long_int = 64'h123456789abcdef;
input clk;
input [7:0] a;
output reg [7:0] x;
reg onebit;
reg [2:1] twoone;
reg [2:1] fourthreetwoone[4:3];
reg LONGSTART_a_very_long_name_which_will_get_hashed_a_very_long_name_which_will_get_hashed_a_very_long_name_which_will_get_hashed_a_very_long_name_which_will_get_hashed_LONGEND ;
// verilator lint_off ASCRANGE
reg [0:61] quads[2:3];
// verilator lint_on ASCRANGE
reg [31:0] count;
reg [31:0] half_count;
reg [7:0] text_byte;
reg [15:0] text_half;
reg [31:0] text_word;
reg [63:0] text_long;
reg [511:0] text;
integer status;
real real1;
string str1;
t_bus bus1;
ModSub sub ();
TestInterface intf_arr[2]();
initial begin
$write("*-* All Finished *-*\n");
$finish();
end
genvar i;
generate
for (i = 1; i <= 2; i = i + 1) begin : arr
ModArr #(.LENGTH(i)) arr ();
end
for (i = 1; i <= 3; i = i + 1) begin : outer_scope
parameter int scoped_param = i * 2;
genvar j;
for (j = 1; j <= 3; j = j + 1) begin : inner_scope
parameter int scoped_param_inner = scoped_param + 1;
ModArr #(.LENGTH(scoped_param_inner)) arr ();
end
end
endgenerate
ModSubWrapper sub_wrap ();
generate
if (do_generate == 1) begin : cond_scope
ModSub scoped_sub ();
parameter int scoped_wire = 1;
ModSubWrapper sub_wrap_gen ();
end else begin : cond_scope_else
ModSub scoped_sub_else ();
end
endgenerate
endmodule : t
module ModSub;
reg subsig1;
reg subsig2;
`ifdef IVERILOG
// stop icarus optimizing signals away
wire redundant = subsig1 | subsig2;
`endif
endmodule : ModSub
module ModArr;
parameter LENGTH = 1;
reg [LENGTH-1:0] sig;
reg [LENGTH-1:0] rfr;
reg check;
reg verbose;
initial begin
sig = {LENGTH{1'b0}};
rfr = {LENGTH{1'b0}};
end
always @(posedge check) begin
if (verbose) $display("%m : %x %x", sig, rfr);
if (check && sig != rfr) $stop;
check <= 0;
end
endmodule : ModArr
module ModSubWrapper;
ModSub my_sub ();
endmodule
|