HDLRuby 2.6.25 → 2.7.11
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/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
|