HDLRuby 2.6.25 → 2.7.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/HDLRuby/hdr_samples/case_bench.rb +23 -18
- 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_init.rb +18 -0
- data/lib/HDLRuby/hdr_samples/with_instance.rb +42 -0
- data/lib/HDLRuby/hdr_samples/with_ref_array.rb +26 -0
- data/lib/HDLRuby/hdr_samples/with_subsums.rb +33 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +61 -0
- data/lib/HDLRuby/hruby_high.rb +87 -27
- data/lib/HDLRuby/hruby_low.rb +4 -1
- data/lib/HDLRuby/hruby_low2c.rb +98 -72
- data/lib/HDLRuby/hruby_low_resolve.rb +30 -1
- data/lib/HDLRuby/hruby_tools.rb +1 -0
- data/lib/HDLRuby/sim/hruby_sim.h +9 -1
- data/lib/HDLRuby/sim/hruby_sim_core.c +5 -2
- data/lib/HDLRuby/sim/hruby_sim_stack_calc.c +80 -33
- 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: 2c66f2d8f552623dabccc43ea54a7246d49eb42a6aaf0f6b8a1977e7675221ca
|
4
|
+
data.tar.gz: 10f9b15022166b3fdb90a9a026653f3fec8b5a05f807e468dfed2d1c97d9adf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c56c51a83e75ddd03d34d0c305a17595c362077010213e299baf60e8a7e0b52e745c6b8f9ada7db3c4931b99809376ffdc54f3f4bbb122e002a82419f39e7fb
|
7
|
+
data.tar.gz: 3f056bd7523dea35b03188aa689a232afeadb7c24f7608f3207fc2479503081e1e1ce0a55c2ad3cc805721b60e7d559d464d9fa89a6f79f3f962388254eac6e7
|
@@ -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,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
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing array references.
|
3
|
+
system :with_concat do
|
4
|
+
[8].inner :count
|
5
|
+
[8].inner :val0,:val1
|
6
|
+
[3].inner :val2
|
7
|
+
[8].inner :val3
|
8
|
+
|
9
|
+
val2 <= val0[4..2]
|
10
|
+
val3[6..3] <= val1[7..4]
|
11
|
+
|
12
|
+
timed do
|
13
|
+
val0 <= _00001111
|
14
|
+
val1 <= _11000011
|
15
|
+
count <= 0
|
16
|
+
!10.ns
|
17
|
+
val0 <= _11110000
|
18
|
+
val1 <= _00111100
|
19
|
+
count <= 1
|
20
|
+
!10.ns
|
21
|
+
val0 <= _10101010
|
22
|
+
val1 <= _01010101
|
23
|
+
count <= 2
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
# A benchmark for sum of sub parts of a vector.
|
3
|
+
system :with_concat do
|
4
|
+
[8].inner :count
|
5
|
+
[16].inner :val0, :val1, :val2, :val3, :val4, :val5, :val6
|
6
|
+
bs = []
|
7
|
+
10.times do |i|
|
8
|
+
bs << [16].inner(:"b#{i}")
|
9
|
+
end
|
10
|
+
|
11
|
+
vals = [val1,val2,val3,val4]
|
12
|
+
par do
|
13
|
+
vals.each.with_index { |val,i| val <= val0[(i*4+3)..i*4] }
|
14
|
+
end
|
15
|
+
val5 <= vals.reduce(:+)
|
16
|
+
|
17
|
+
par do
|
18
|
+
bs.each.with_index { |b,i| b <= val0[i..i] }
|
19
|
+
end
|
20
|
+
val6 <= bs.reduce(:+)
|
21
|
+
|
22
|
+
timed do
|
23
|
+
val0 <= _1111000011110000
|
24
|
+
count <= 0
|
25
|
+
!10.ns
|
26
|
+
val0 <= _0000111100001111
|
27
|
+
count <= 1
|
28
|
+
!10.ns
|
29
|
+
val0 <= _1010101010101010
|
30
|
+
count <= 2
|
31
|
+
!10.ns
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
# A benchmark for testing the literal values.
|
3
|
+
system :with_values do
|
4
|
+
inner :v1
|
5
|
+
[8].inner :v8
|
6
|
+
[16].inner :v16
|
7
|
+
[32].inner :v32
|
8
|
+
[56].inner :v56
|
9
|
+
[64].inner :v64
|
10
|
+
[96].inner :v96
|
11
|
+
|
12
|
+
|
13
|
+
timed do
|
14
|
+
v1 <= 0
|
15
|
+
v8 <= 0
|
16
|
+
v16 <= 0
|
17
|
+
v32 <= 0
|
18
|
+
v56 <= 0
|
19
|
+
v64 <= 0
|
20
|
+
v96 <= 0
|
21
|
+
!10.ns
|
22
|
+
v1 <= 1
|
23
|
+
v8 <= 1
|
24
|
+
v16 <= 1
|
25
|
+
v32 <= 1
|
26
|
+
v56 <= 1
|
27
|
+
v64 <= 1
|
28
|
+
v96 <= 1
|
29
|
+
!10.ns
|
30
|
+
v1 <= _1010[2]
|
31
|
+
v8 <= _uhFF00[12..4]
|
32
|
+
!10.ns
|
33
|
+
v8 <= 128
|
34
|
+
v16 <= 128
|
35
|
+
v32 <= 128
|
36
|
+
v56 <= 128
|
37
|
+
v64 <= 128
|
38
|
+
v96 <= 128
|
39
|
+
!10.ns
|
40
|
+
v16 <= 0x1000
|
41
|
+
v32 <= 0x1000
|
42
|
+
v56 <= 0x1000
|
43
|
+
v64 <= 0x1000
|
44
|
+
v96 <= 0x1000
|
45
|
+
!10.ns
|
46
|
+
v32 <= 0x10000000
|
47
|
+
v56 <= 0x10000000
|
48
|
+
v64 <= 0x10000000
|
49
|
+
v96 <= 0x10000000
|
50
|
+
!10.ns
|
51
|
+
v56 <= 0x10000000000000
|
52
|
+
v64 <= 0x10000000000000
|
53
|
+
v96 <= 0x10000000000000
|
54
|
+
!10.ns
|
55
|
+
v64 <= 0x1000000000000000
|
56
|
+
v96 <= 0x1000000000000000
|
57
|
+
!10.ns
|
58
|
+
v96 <= 0x1000000000000000000
|
59
|
+
!10.ns
|
60
|
+
end
|
61
|
+
end
|