HDLRuby 2.7.1 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +22 -0
- data/lib/HDLRuby/hdr_samples/adder_gen_gen.rb +40 -0
- data/lib/HDLRuby/hdr_samples/case_bench.rb +23 -18
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +1 -1
- data/lib/HDLRuby/hdr_samples/parseq_bench.rb +61 -0
- data/lib/HDLRuby/hdr_samples/range_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/rom_nest.rb +27 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +128 -0
- data/lib/HDLRuby/hdr_samples/with_def.rb +29 -0
- data/lib/HDLRuby/hdr_samples/with_init.rb +18 -0
- data/lib/HDLRuby/hdr_samples/with_instance.rb +42 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +75 -67
- data/lib/HDLRuby/hdr_samples/with_terminate.rb +32 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +3 -0
- data/lib/HDLRuby/hdrcc.rb +8 -1
- data/lib/HDLRuby/hruby_high.rb +178 -29
- data/lib/HDLRuby/hruby_low.rb +210 -4
- data/lib/HDLRuby/hruby_low2c.rb +186 -71
- data/lib/HDLRuby/hruby_low2vhd.rb +12 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +12 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +20 -1
- data/lib/HDLRuby/hruby_low_resolve.rb +30 -1
- data/lib/HDLRuby/hruby_low_without_select.rb +11 -1
- data/lib/HDLRuby/hruby_tools.rb +1 -0
- data/lib/HDLRuby/hruby_verilog.rb +9 -1
- data/lib/HDLRuby/sim/hruby_sim.h +26 -1
- data/lib/HDLRuby/sim/hruby_sim_core.c +65 -8
- data/lib/HDLRuby/sim/hruby_sim_stack_calc.c +11 -0
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +1 -1
- data/lib/HDLRuby/std/reconf.rb +3 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90d139cd510b6600a32249a2e27969f6c415a49d9b26ba51ed84d20dcc82f2ba
|
4
|
+
data.tar.gz: b064d08cfbd46ae6fa4dffc7536a2dece4aed9c1c7588118502df79dd288c5bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40ced20f6723ff46f4c02a033c1d194e5ce267c75e7f2c22e6c70dd6f51ae9b530ebdc7dc7150970f3fefbf2ec4663c965a3a3fddf1c1b2369d6dac42317ba0c
|
7
|
+
data.tar.gz: 7782898ea6de9b5e42015f84dc56929ecd038baf42337c1f69f96bc644f0692ddd00ada0db0f9910b8ae7d93d2516ed4b3819c9f8735268d0a952f72b56bb37e
|
@@ -5,3 +5,25 @@ system :adder do |w|
|
|
5
5
|
|
6
6
|
s <= x.as(bit[w+1]) + y
|
7
7
|
end
|
8
|
+
|
9
|
+
|
10
|
+
# Testing the generic adder.
|
11
|
+
system :adder_bench do
|
12
|
+
width = 4
|
13
|
+
[width].inner :x,:y
|
14
|
+
[width+1].inner :z
|
15
|
+
|
16
|
+
adder(width).(:my_adder).(x,y,z)
|
17
|
+
|
18
|
+
timed do
|
19
|
+
x <= 0
|
20
|
+
y <= 0
|
21
|
+
!10.ns
|
22
|
+
x <= 1
|
23
|
+
!10.ns
|
24
|
+
y <= 1
|
25
|
+
!10.ns
|
26
|
+
x <= 15
|
27
|
+
!10.ns
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# A simple generic adder
|
2
|
+
system :adder do |w|
|
3
|
+
[(w-1)..0].input :i,:j
|
4
|
+
[w..0].output :k
|
5
|
+
|
6
|
+
k <= i.as(bit[w+1]) + j
|
7
|
+
end
|
8
|
+
|
9
|
+
# A module embedding two generic adders.
|
10
|
+
system :two_adders do |w|
|
11
|
+
[w*2].input :x, :y
|
12
|
+
[(w+1)*2].output :z
|
13
|
+
|
14
|
+
adder(w).(:adderI0).(x[(w-1)..0],y[(w-1)..0],z[w..0])
|
15
|
+
adder(w).(:adderI1).(x[(w*2-1)..w],y[(w*2-1)..w],z[(w*2+1)..(w+1)])
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# Testing the generic adder.
|
20
|
+
system :adder_bench do
|
21
|
+
width = 4
|
22
|
+
[width*2].inner :a,:b
|
23
|
+
[(width+1)*2].inner :c
|
24
|
+
|
25
|
+
two_adders(width).(:my_adders).(a,b,c)
|
26
|
+
|
27
|
+
timed do
|
28
|
+
a <= 0
|
29
|
+
b <= 0
|
30
|
+
!10.ns
|
31
|
+
a <= 1
|
32
|
+
!10.ns
|
33
|
+
b <= 1
|
34
|
+
!10.ns
|
35
|
+
a <= 255
|
36
|
+
!10.ns
|
37
|
+
b <= 128
|
38
|
+
!10.ns
|
39
|
+
end
|
40
|
+
end
|
@@ -1,30 +1,35 @@
|
|
1
1
|
# Test the comparison operators.
|
2
2
|
|
3
|
-
# A benchmark for the
|
3
|
+
# A benchmark for the if statement.
|
4
4
|
system :if_bench do
|
5
|
-
[8].inner :x, :
|
5
|
+
[8].inner :x, :z
|
6
6
|
|
7
7
|
par do
|
8
8
|
hcase(x)
|
9
|
-
hwhen(0)
|
10
|
-
hwhen(1)
|
11
|
-
hwhen(2)
|
12
|
-
hwhen(3)
|
13
|
-
|
9
|
+
hwhen(0) { z <= 0 }
|
10
|
+
hwhen(1) { z <= 1 }
|
11
|
+
hwhen(2) { z <= 4 }
|
12
|
+
hwhen(3) { z <= 9 }
|
13
|
+
hwhen(4) { z <= 16 }
|
14
|
+
hwhen(5) { z <= 25 }
|
15
|
+
hwhen(6) { z <= 36 }
|
16
|
+
hwhen(7) { z <= 49 }
|
17
|
+
hwhen(8) { z <= 64 }
|
18
|
+
hwhen(9) { z <= 81 }
|
19
|
+
hwhen(10) { z <= 100 }
|
20
|
+
hwhen(11) { z <= 121 }
|
21
|
+
hwhen(12) { z <= 144 }
|
22
|
+
hwhen(13) { z <= 169 }
|
23
|
+
hwhen(14) { z <= 196 }
|
24
|
+
hwhen(15) { z <= 225 }
|
25
|
+
helse { z <= _zzzzzzzz }
|
14
26
|
end
|
15
27
|
|
16
28
|
timed do
|
17
|
-
x <= 0
|
18
|
-
!10.ns
|
19
|
-
x <= 1
|
20
|
-
!10.ns
|
21
|
-
x <= 2
|
22
|
-
!10.ns
|
23
|
-
x <= 3
|
24
|
-
!10.ns
|
25
|
-
x <= 4
|
26
|
-
!10.ns
|
27
|
-
x <= 5
|
28
29
|
!10.ns
|
30
|
+
20.times do |i|
|
31
|
+
x <= i
|
32
|
+
!10.ns
|
33
|
+
end
|
29
34
|
end
|
30
35
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Check of various par and seq.
|
2
|
+
|
3
|
+
# A benchmark for the dff.
|
4
|
+
system :parseq_bench do
|
5
|
+
[4].inner :x0, :x1, :x2, :x3
|
6
|
+
[4].inner :y0, :y1, :y2, :y3
|
7
|
+
[4].inner :z00, :z01
|
8
|
+
[4].inner :z10, :z11
|
9
|
+
[4].inner :z20, :z21
|
10
|
+
[4].inner :z30, :z31
|
11
|
+
[4].inner :u0, :u1, :u2, :u3
|
12
|
+
bit[4][-16].constant mem: 16.times.to_a
|
13
|
+
|
14
|
+
par(x0) do
|
15
|
+
z00 <= x0 + y0
|
16
|
+
z01 <= z00 + 1
|
17
|
+
u0 <= mem[z00]
|
18
|
+
end
|
19
|
+
|
20
|
+
seq(y1) do
|
21
|
+
z10 <= x1 + y1
|
22
|
+
z11 <= z10 + 1
|
23
|
+
u1 <= mem[z10]
|
24
|
+
end
|
25
|
+
|
26
|
+
seq(x2,y2) do
|
27
|
+
z20 <= x2 + y2
|
28
|
+
z21 <= z20 + 1
|
29
|
+
u2 <= mem[z20]
|
30
|
+
end
|
31
|
+
|
32
|
+
par do
|
33
|
+
bit[4].constant inc: 1
|
34
|
+
z30 <= x3 + y3
|
35
|
+
z31 <= z30 + inc
|
36
|
+
u3 <= mem[z30]
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
timed do
|
41
|
+
x0 <= 1
|
42
|
+
x1 <= 1
|
43
|
+
x2 <= 1
|
44
|
+
x3 <= 1
|
45
|
+
!10.ns
|
46
|
+
y0 <= 2
|
47
|
+
y1 <= 2
|
48
|
+
y2 <= 2
|
49
|
+
y3 <= 2
|
50
|
+
!10.ns
|
51
|
+
x0 <= 3
|
52
|
+
x1 <= 3
|
53
|
+
x2 <= 3
|
54
|
+
x3 <= 3
|
55
|
+
y0 <= 4
|
56
|
+
y1 <= 4
|
57
|
+
y2 <= 4
|
58
|
+
y3 <= 4
|
59
|
+
!10.ns
|
60
|
+
end
|
61
|
+
end
|
@@ -3,13 +3,16 @@
|
|
3
3
|
# A benchmark for the index access..
|
4
4
|
system :if_bench do
|
5
5
|
[8].inner :x
|
6
|
-
[2].inner :r0,:r1,:r2,:r3
|
6
|
+
[2].inner :r0,:r1,:r2,:r3, :r4
|
7
|
+
inner :r5
|
7
8
|
|
8
9
|
par do
|
9
10
|
r0 <= x[1..0]
|
10
11
|
r1 <= x[3..2]
|
11
12
|
r2 <= x[5..4]
|
12
13
|
r3 <= x[7..6]
|
14
|
+
r4 <= x[-1..-2]
|
15
|
+
r5 <= x[-1]
|
13
16
|
end
|
14
17
|
|
15
18
|
timed do
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Rom access generator, def case.
|
2
|
+
def rom_gen(addr,&func)
|
3
|
+
bit[8][-8].constant tbl? => 8.times.map {|i| func.(i).to_i }
|
4
|
+
tbl![addr]
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
system :test_rom do
|
10
|
+
[2..0].inner :addr
|
11
|
+
[7..0].inner :data0, :data1, :data2, :data3
|
12
|
+
|
13
|
+
data0 <= rom_gen(addr) { |i| i*i }
|
14
|
+
data1 <= rom_gen(addr) { |i| i*i }
|
15
|
+
|
16
|
+
par do
|
17
|
+
data2 <= rom_gen(addr) { |i| i*i }
|
18
|
+
data3 <= rom_gen(addr) { |i| i*i }
|
19
|
+
end
|
20
|
+
|
21
|
+
timed do
|
22
|
+
8.times do |i|
|
23
|
+
addr <= i
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'std/channel.rb'
|
2
|
+
require 'std/hruby_unit.rb'
|
3
|
+
|
4
|
+
include HDLRuby::High::Std
|
5
|
+
|
6
|
+
# A clocked handshake channel for testing purpuse.
|
7
|
+
channel(:handshake) do |typ,clk|
|
8
|
+
inner has_data: 0
|
9
|
+
inner :set_data
|
10
|
+
inner :get_data
|
11
|
+
typ.inner :data, :data_val
|
12
|
+
|
13
|
+
writer_input :has_data
|
14
|
+
writer_output :set_data, :data_val
|
15
|
+
reader_input :has_data, :data
|
16
|
+
reader_output :get_data
|
17
|
+
|
18
|
+
par(clk.negedge) do
|
19
|
+
hif(set_data) do
|
20
|
+
data <= data_val
|
21
|
+
has_data <= 1
|
22
|
+
end
|
23
|
+
helsif(get_data) do
|
24
|
+
has_data <= 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# The writer.
|
29
|
+
writer do |blk,target|
|
30
|
+
hif(~has_data) do
|
31
|
+
set_data <= 1
|
32
|
+
data_val <= target
|
33
|
+
blk.call if blk
|
34
|
+
end
|
35
|
+
helse { set_data <= 0 }
|
36
|
+
end
|
37
|
+
|
38
|
+
# The reader
|
39
|
+
reader do |blk,target|
|
40
|
+
hif(has_data) do
|
41
|
+
target <= data
|
42
|
+
get_data <= 1
|
43
|
+
blk.call if blk
|
44
|
+
end
|
45
|
+
helse { get_data <= 0 }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# A system writing indefinitely to a channel.
|
52
|
+
# Checking usage of channel without declaring a port.
|
53
|
+
system :producer8 do |channel|
|
54
|
+
# Inputs of the producer: clock and reset.
|
55
|
+
input :clk, :rst
|
56
|
+
# Inner 8-bit counter for generating values.
|
57
|
+
[8].inner :counter
|
58
|
+
|
59
|
+
# The value production process
|
60
|
+
par(clk.posedge) do
|
61
|
+
hif(rst) { counter <= 0 }
|
62
|
+
helse do
|
63
|
+
channel.write(counter) { counter <= counter + 1 }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# A system reading indefinitely from a channel.
|
69
|
+
system :consummer8 do |channel|
|
70
|
+
# Input of the consummer: a clock is enough.
|
71
|
+
input :clk
|
72
|
+
# # Instantiate the channel ports
|
73
|
+
# channel.input :ch
|
74
|
+
# Inner buffer for storing the cunsummed value.
|
75
|
+
[8].inner :buf
|
76
|
+
|
77
|
+
# The value consumption process
|
78
|
+
par(clk.posedge) do
|
79
|
+
channel.read(buf)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# A system testing the handshaker.
|
85
|
+
Unit.system :hs_test do
|
86
|
+
inner :clk,:rst
|
87
|
+
|
88
|
+
# Declares two handshakers
|
89
|
+
handshake(bit[8],clk).(:hs)
|
90
|
+
|
91
|
+
# For the first handshake
|
92
|
+
|
93
|
+
# Instantiate the producer.
|
94
|
+
producer8(hs).(:producerI).(clk,rst)
|
95
|
+
|
96
|
+
# Instantiate the consummer.
|
97
|
+
consummer8(hs).(:consummerI).(clk)
|
98
|
+
|
99
|
+
test do
|
100
|
+
clk <= 0
|
101
|
+
rst <= 0
|
102
|
+
!10.ns
|
103
|
+
clk <= 1
|
104
|
+
!10.ns
|
105
|
+
clk <= 0
|
106
|
+
rst <= 1
|
107
|
+
!10.ns
|
108
|
+
clk <= 1
|
109
|
+
!10.ns
|
110
|
+
clk <= 0
|
111
|
+
!10.ns
|
112
|
+
!10.ns
|
113
|
+
clk <= 1
|
114
|
+
!10.ns
|
115
|
+
clk <= 0
|
116
|
+
rst <= 0
|
117
|
+
!10.ns
|
118
|
+
clk <= 1
|
119
|
+
!10.ns
|
120
|
+
10.times do
|
121
|
+
clk <= 0
|
122
|
+
!10.ns
|
123
|
+
clk <= 1
|
124
|
+
!10.ns
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# A test of def.
|
2
|
+
def lut84(content,addr)
|
3
|
+
bit[8][-4].inner tbl? => content.to_a
|
4
|
+
tbl![addr]
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
# A benchmark for testing the initialization of signals.
|
9
|
+
system :def_bench do
|
10
|
+
|
11
|
+
[2].inner :addr
|
12
|
+
[8].inner :val0, :val1
|
13
|
+
|
14
|
+
par do
|
15
|
+
val0 <= lut84([0,1,4,9],addr)
|
16
|
+
val1 <= lut84([0,1,4,9],3-addr)
|
17
|
+
end
|
18
|
+
|
19
|
+
timed do
|
20
|
+
addr <= 0
|
21
|
+
!10.ns
|
22
|
+
addr <= 1
|
23
|
+
!10.ns
|
24
|
+
addr <= 2
|
25
|
+
!10.ns
|
26
|
+
addr <= 3
|
27
|
+
!10.ns
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the initialization of signals.
|
3
|
+
system :with_init do
|
4
|
+
[8].constant cst0: 127
|
5
|
+
constant cst1: _1
|
6
|
+
[8].inner sig0: _10000000
|
7
|
+
inner sig1: _1
|
8
|
+
[8].inner :sig2
|
9
|
+
|
10
|
+
timed do
|
11
|
+
!10.ns
|
12
|
+
sig2 <= cst0 + cst1
|
13
|
+
sig0 <= sig0 + sig1
|
14
|
+
!10.ns
|
15
|
+
sig2 <= sig2 + sig1
|
16
|
+
!10.ns
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
# A benchmark for testing the instantiations.
|
5
|
+
|
6
|
+
system :adder do |typ|
|
7
|
+
typ.input :x, :y
|
8
|
+
typ.output :z
|
9
|
+
|
10
|
+
z <= x + y
|
11
|
+
end
|
12
|
+
|
13
|
+
system :truc do
|
14
|
+
[8].input :u, :v
|
15
|
+
[8].output :q
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
system :with_instance do
|
21
|
+
|
22
|
+
[8].inner :x0, :y0, :z0, :x1, :y1, :z1
|
23
|
+
|
24
|
+
truc(:montruc).(x0,y0,z0)
|
25
|
+
|
26
|
+
adder(bit[8]).(:adderI0).(x0,y0,z0)
|
27
|
+
adder(bit[8]).(:adderI1).(x: x1, y: y1, z: z1)
|
28
|
+
|
29
|
+
timed do
|
30
|
+
!10.ns
|
31
|
+
x0 <= 0
|
32
|
+
y0 <= 0
|
33
|
+
x1 <= 1
|
34
|
+
y1 <= 1
|
35
|
+
!10.ns
|
36
|
+
x0 <= 1
|
37
|
+
y0 <= 1
|
38
|
+
x1 <= 2
|
39
|
+
y1 <= 2
|
40
|
+
!10.ns
|
41
|
+
end
|
42
|
+
end
|
@@ -4,60 +4,16 @@ include HDLRuby::High::Std
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
|
8
|
-
# Implementation of a vivado partial reconfiguration system.
|
9
|
-
reconf(:vivado_reconf) do |clk,rst|
|
10
|
-
|
11
|
-
# Get access to the interface of the reconfigurable component.
|
12
|
-
inputs = each_input
|
13
|
-
outputs = each_output
|
14
|
-
inouts = each_inout
|
15
|
-
|
16
|
-
# Create the main system with the interface and a channel for
|
17
|
-
# handling the reconfiguration.
|
18
|
-
main = system do
|
19
|
-
# Declares the inputs.
|
20
|
-
inputs.each do |i|
|
21
|
-
i.type.input(i.name)
|
22
|
-
end
|
23
|
-
# Declares the outputs.
|
24
|
-
outputs.each do |o|
|
25
|
-
o.type.output(o.name)
|
26
|
-
end
|
27
|
-
# Declares the inouts.
|
28
|
-
inouts.each do |io|
|
29
|
-
io.type.inout(io.name)
|
30
|
-
end
|
31
|
-
# An that's all: in vivado the main system is to be a black-box.
|
32
|
-
end
|
33
|
-
|
34
|
-
# And set it as the main system.
|
35
|
-
set_main(main)
|
36
|
-
|
37
|
-
# The switching circuit.
|
38
|
-
# reconfer = vivado_reconfigurer :do_reconf # Will be that later
|
39
|
-
# reconfer.clk <= clk
|
40
|
-
# reconfer.rst <= rst
|
41
|
-
reconfer = proc do |idx|
|
42
|
-
puts "Instantiating reconfiguration circuits with #{idx}"
|
43
|
-
end
|
44
|
-
|
45
|
-
# Defines the reconfiguring procedure: switch to system idx.
|
46
|
-
switcher do |idx,ruby_block|
|
47
|
-
reconfer.call(idx)
|
48
|
-
ruby_block.call
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
# Some system that can be used for recponfiguration.
|
7
|
+
# Some system that can be used for reconfiguration.
|
55
8
|
system :sys0 do
|
56
9
|
input :clk,:rst
|
57
10
|
input :d
|
58
11
|
output :q
|
59
12
|
|
60
|
-
|
13
|
+
par(clk.posedge) do
|
14
|
+
hprint("sys0\n")
|
15
|
+
q <= d & ~rst
|
16
|
+
end
|
61
17
|
end
|
62
18
|
|
63
19
|
system :sys1 do
|
@@ -65,7 +21,10 @@ system :sys1 do
|
|
65
21
|
input :d
|
66
22
|
output :q
|
67
23
|
|
68
|
-
(
|
24
|
+
par(clk.posedge, rst.posedge) do
|
25
|
+
hprint("sys1\n")
|
26
|
+
q <= d & ~rst
|
27
|
+
end
|
69
28
|
end
|
70
29
|
|
71
30
|
system :sys2 do
|
@@ -73,7 +32,10 @@ system :sys2 do
|
|
73
32
|
input :d
|
74
33
|
output :q
|
75
34
|
|
76
|
-
(
|
35
|
+
par(clk.posedge, rst.negedge) do
|
36
|
+
hprint("sys2\n")
|
37
|
+
q <= d & ~rst
|
38
|
+
end
|
77
39
|
end
|
78
40
|
|
79
41
|
# A system with a reconfifurable part.
|
@@ -81,23 +43,69 @@ system :with_reconf do
|
|
81
43
|
input :clk,:rst
|
82
44
|
input :d
|
83
45
|
output :q
|
84
|
-
[2].input :conf # The configuration number
|
85
|
-
|
86
|
-
inner :wait_reconf
|
87
46
|
|
88
|
-
#
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
47
|
+
# Instantiate the default configuration.
|
48
|
+
sys0(:my_dff).(clk,rst,d,q)
|
49
|
+
|
50
|
+
# Adds the additional configuration.
|
51
|
+
my_dff.choice(conf1: sys1, conf2: sys2)
|
52
|
+
|
53
|
+
timed do
|
54
|
+
clk <= 0
|
55
|
+
rst <= 0
|
56
|
+
d <= 0
|
57
|
+
!10.ns
|
58
|
+
clk <= 1
|
59
|
+
!10.ns
|
60
|
+
clk <= 0
|
61
|
+
rst <= 1
|
62
|
+
!10.ns
|
63
|
+
clk <= 1
|
64
|
+
!10.ns
|
65
|
+
clk <= 0
|
66
|
+
rst <= 0
|
67
|
+
!10.ns
|
68
|
+
3.times do |i|
|
69
|
+
clk <= 1
|
70
|
+
!10.ns
|
71
|
+
clk <= 0
|
72
|
+
d <= 1
|
73
|
+
!10.ns
|
74
|
+
clk <= 1
|
75
|
+
!10.ns
|
76
|
+
clk <= 0
|
77
|
+
d <= 0
|
78
|
+
!10.ns
|
79
|
+
clk <= 1
|
80
|
+
my_dff.configure((i+1)%3)
|
81
|
+
!10.ns
|
82
|
+
clk <= 0
|
83
|
+
!10.ns
|
101
84
|
end
|
85
|
+
clk <= 1
|
86
|
+
!10.ns
|
87
|
+
clk <= 0
|
88
|
+
d <= 1
|
89
|
+
!10.ns
|
90
|
+
clk <= 1
|
91
|
+
my_dff.configure(:conf1)
|
92
|
+
!10.ns
|
93
|
+
clk <= 0
|
94
|
+
d <= 0
|
95
|
+
!10.ns
|
96
|
+
clk <= 1
|
97
|
+
my_dff.configure(:conf2)
|
98
|
+
!10.ns
|
99
|
+
clk <= 0
|
100
|
+
d <= 1
|
101
|
+
!10.ns
|
102
|
+
clk <= 1
|
103
|
+
my_dff.configure(:my_dff)
|
104
|
+
!10.ns
|
105
|
+
clk <= 0
|
106
|
+
d <= 0
|
107
|
+
!10.ns
|
108
|
+
clk <= 1
|
109
|
+
!10.ns
|
102
110
|
end
|
103
111
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the terminate statement.
|
3
|
+
system :with_terminate do
|
4
|
+
[8].constant cst0: 127
|
5
|
+
constant cst1: _1
|
6
|
+
[8].inner sig0: _10000000
|
7
|
+
inner sig1: _1
|
8
|
+
[8].inner :sig2
|
9
|
+
[8].inner count: 0
|
10
|
+
|
11
|
+
timed do
|
12
|
+
!20.ns
|
13
|
+
100.times do
|
14
|
+
count <= count + 1
|
15
|
+
!20.ns
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
timed do
|
20
|
+
!10.ns
|
21
|
+
sig2 <= cst0 + cst1
|
22
|
+
sig0 <= sig0 + sig1
|
23
|
+
!10.ns
|
24
|
+
sig2 <= sig2 + sig1
|
25
|
+
!10.ns
|
26
|
+
terminate
|
27
|
+
sig0 <= sig0 + sig0
|
28
|
+
!10.ns
|
29
|
+
sig0 <= sig0 + sig0
|
30
|
+
!10.ns
|
31
|
+
end
|
32
|
+
end
|