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
|
module Example(outA, outB, outC, outD);
parameter OUTPUT = "FOO";
output wire [23:0] outA;
output wire [23:0] outB;
output reg outC, outD;
function automatic [23:0] flip;
input [23:0] inp;
flip = ~inp;
endfunction
generate
if (flip(OUTPUT) == flip("BAR"))
assign outA = OUTPUT;
else
assign outA = 0;
case (flip(OUTPUT))
flip("FOO"): assign outB = OUTPUT;
flip("BAR"): assign outB = 0;
flip("BAZ"): assign outB = "HI";
endcase
genvar i;
initial outC = 0;
for (i = 0; i != flip(flip(OUTPUT[15:8])); i = i + 1)
if (i + 1 == flip(flip("O")))
initial outC = 1;
endgenerate
integer j;
initial begin
outD = 1;
for (j = 0; j != flip(flip(OUTPUT[15:8])); j = j + 1)
if (j + 1 == flip(flip("O")))
outD = 0;
end
endmodule
module top(out);
wire [23:0] a1, a2, a3, a4;
wire [23:0] b1, b2, b3, b4;
wire c1, c2, c3, c4;
wire d1, d2, d3, d4;
Example e1(a1, b1, c1, d1);
Example #("FOO") e2(a2, b2, c2, d2);
Example #("BAR") e3(a3, b3, c3, d3);
Example #("BAZ") e4(a4, b4, c4, d4);
output wire [24 * 8 - 1 + 4 :0] out;
assign out = {
a1, a2, a3, a4,
b1, b2, b3, b4,
c1, c2, c3, c4,
d1, d2, d3, d4};
function signed [31:0] negate;
input integer inp;
negate = ~inp;
endfunction
parameter W = 10;
parameter X = 3;
localparam signed Y = $floor(W / X);
localparam signed Z = negate($floor(W / X));
// `define VERIFY
`ifdef VERIFY
assert property (a1 == 0);
assert property (a2 == 0);
assert property (a3 == "BAR");
assert property (a4 == 0);
assert property (b1 == "FOO");
assert property (b2 == "FOO");
assert property (b3 == 0);
assert property (b4 == "HI");
assert property (c1 == 1);
assert property (c2 == 1);
assert property (c3 == 0);
assert property (c4 == 0);
assert property (d1 == 0);
assert property (d2 == 0);
assert property (d3 == 1);
assert property (d4 == 1);
assert property (Y == 3);
assert property (Z == ~3);
`endif
endmodule
|