HDLRuby 2.5.1 → 2.6.8
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/adder.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +40 -0
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +3 -3
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/multi_timed_bench.rb +54 -0
- data/lib/HDLRuby/hdr_samples/music.rb +79 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
- data/lib/HDLRuby/hdr_samples/type_minmax_bench.rb +37 -0
- data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
- data/lib/HDLRuby/hdr_samples/with_to_array.rb +29 -0
- data/lib/HDLRuby/hdrcc.rb +69 -9
- data/lib/HDLRuby/hruby_decorator.rb +3 -1
- data/lib/HDLRuby/hruby_high.rb +220 -29
- data/lib/HDLRuby/hruby_low.rb +433 -45
- data/lib/HDLRuby/hruby_low2c.rb +122 -168
- data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
- data/lib/HDLRuby/hruby_low2high.rb +331 -549
- data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
- data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
- data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
- data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
- data/lib/HDLRuby/hruby_tools.rb +11 -1
- data/lib/HDLRuby/hruby_verilog.rb +1572 -1723
- data/lib/HDLRuby/sim/hruby_sim.h +45 -5
- data/lib/HDLRuby/sim/hruby_sim_calc.c +192 -20
- data/lib/HDLRuby/sim/hruby_sim_core.c +24 -9
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +7 -3
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
- data/lib/HDLRuby/std/fixpoint.rb +9 -0
- data/lib/HDLRuby/std/function_generator.rb +139 -0
- data/lib/HDLRuby/std/hruby_unit.rb +75 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +18 -6
- data/lib/HDLRuby/hruby_unit.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01f27a3801dbe93fa55cba40a6a66b91f94df070e255689ac9d73f894b006bd0
|
4
|
+
data.tar.gz: 911aadbbb04317300946682df515527e72602d36aacb792bc2c3f80ea88fa14d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea09062dfce477be1db11be382672323711d6fa996cb2f3716cd43692ba1063f9ccd651b6b870a09b319fbd8374b82635075a72b00b89a8e305385adf72c097b
|
7
|
+
data.tar.gz: 0ecc3b863e4e41ed3f25083dcf579b014a2a6d04dfb41cd71262d45d115b4efb23d8d869c714508ada05b0a239afd484143733a16343f9fd8738375bbf871dbe
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Test the comparison operators.
|
2
|
+
|
3
|
+
# A benchmark for the adder.
|
4
|
+
system :adder_bench do
|
5
|
+
[8].inner :x, :y
|
6
|
+
signed[8].inner :u,:v
|
7
|
+
inner :ue, :ult, :ule, :ugt, :uge
|
8
|
+
inner :se, :slt, :sle, :sgt, :sge
|
9
|
+
|
10
|
+
par do
|
11
|
+
ue <= (x == y)
|
12
|
+
ult <= (x < y)
|
13
|
+
ule <= (x <= y)
|
14
|
+
ugt <= (x > y)
|
15
|
+
uge <= (x >= y)
|
16
|
+
|
17
|
+
se <= (u == v)
|
18
|
+
slt <= (u < v)
|
19
|
+
sle <= (u <= v)
|
20
|
+
sgt <= (u > v)
|
21
|
+
sge <= (u >= v)
|
22
|
+
end
|
23
|
+
|
24
|
+
timed do
|
25
|
+
x <= 0
|
26
|
+
y <= 0
|
27
|
+
u <= 0
|
28
|
+
v <= 0
|
29
|
+
!10.ns
|
30
|
+
x <= 1
|
31
|
+
u <= 1
|
32
|
+
!10.ns
|
33
|
+
y <= 2
|
34
|
+
v <= 2
|
35
|
+
!10.ns
|
36
|
+
x <= 2
|
37
|
+
u <= -2
|
38
|
+
!10.ns
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Sample for testing constant declaration in function.
|
2
|
+
|
3
|
+
|
4
|
+
function :func do |addr|
|
5
|
+
bit[4][-4].constant tbl: [ _0000, _0001, _0010, _0011 ]
|
6
|
+
|
7
|
+
tbl[addr]
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
system :with_func do
|
12
|
+
[4].inner :addr, :val
|
13
|
+
|
14
|
+
val <= func(addr)
|
15
|
+
# val <= 1
|
16
|
+
|
17
|
+
timed do
|
18
|
+
addr <= 0
|
19
|
+
!10.ns
|
20
|
+
addr <= 1
|
21
|
+
!10.ns
|
22
|
+
addr <= 2
|
23
|
+
!10.ns
|
24
|
+
addr <= 3
|
25
|
+
!10.ns
|
26
|
+
end
|
27
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# Testing HDLRuby unit test.
|
2
|
-
# require 'hruby_unit.rb'
|
2
|
+
# require 'std/hruby_unit.rb'
|
3
3
|
|
4
4
|
# Declare multiple simple dff-systems and their corresponding test.
|
5
5
|
|
6
|
-
|
6
|
+
3.times do |i|
|
7
7
|
|
8
8
|
# A simple D-FF
|
9
9
|
system:"dff#{i}" do
|
@@ -21,7 +21,7 @@
|
|
21
21
|
|
22
22
|
send(:"dff#{i}",:dffI).(clk,rst,d,q,qb)
|
23
23
|
|
24
|
-
|
24
|
+
test do
|
25
25
|
clk <= 0
|
26
26
|
rst <= 0
|
27
27
|
d <= 0
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Describes an 8-bit data 16-bit address ROM.
|
2
|
+
system :huge_rom do
|
3
|
+
[15..0].input :addr
|
4
|
+
[7..0].output :data
|
5
|
+
|
6
|
+
bit[7..0][-65536].constant content: 65536.times.to_a
|
7
|
+
|
8
|
+
data <= content[addr]
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
system :test_rom do
|
14
|
+
[15..0].inner :addr
|
15
|
+
[7..0].inner :data
|
16
|
+
|
17
|
+
huge_rom(:my_rom).(addr,data)
|
18
|
+
|
19
|
+
timed do
|
20
|
+
8.times do |i|
|
21
|
+
addr <= i
|
22
|
+
!10.ns
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
# A benchmark for the logic operations.
|
3
|
+
system :logic_bench do
|
4
|
+
[3].inner :x,:y
|
5
|
+
[3].inner :s_not, :s_and, :s_or, :s_xor, :s_nxor
|
6
|
+
|
7
|
+
timed do
|
8
|
+
8.times do |i|
|
9
|
+
8.times do |j|
|
10
|
+
x <= i
|
11
|
+
y <= j
|
12
|
+
s_not <= ~x
|
13
|
+
s_and <= x & y
|
14
|
+
s_or <= x | y
|
15
|
+
s_xor <= x ^ y
|
16
|
+
s_nxor <= (x == y)
|
17
|
+
!10.ns
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -28,7 +28,7 @@ system :mei8 do |prog_file = "./prog.obj"|
|
|
28
28
|
bit[7..0][-256].constant mem: # The content of the memory
|
29
29
|
( File.readlines(prog_file).map {|l| l.split[0] }.select do |l|
|
30
30
|
["0","1"].include?(l[2])
|
31
|
-
end.map {|l| l[2..9] } )
|
31
|
+
end.map {|l| l[2..9].to_i(2) } )
|
32
32
|
instr <= mem[addr] # The access procedure
|
33
33
|
end
|
34
34
|
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Test the execution of multiple timed behaviors
|
2
|
+
system :multi_timed do
|
3
|
+
inner :clk1, :clk2, :rst, :button
|
4
|
+
[8].inner :counter1, :counter2
|
5
|
+
|
6
|
+
# The process controlling counter1.
|
7
|
+
par(clk1.posedge) do
|
8
|
+
hif(rst) { counter1 <= 0 }
|
9
|
+
helsif(button) { counter1 <= counter1 + 1 }
|
10
|
+
end
|
11
|
+
|
12
|
+
# The process controlling counter2.
|
13
|
+
par(clk2.posedge) do
|
14
|
+
hif(rst) { counter2 <= 0 }
|
15
|
+
helsif(button) { counter2 <= counter2 + 1 }
|
16
|
+
end
|
17
|
+
|
18
|
+
# The process for clk1
|
19
|
+
timed do
|
20
|
+
50.times do
|
21
|
+
clk1 <= 0
|
22
|
+
!10.ns
|
23
|
+
clk1 <= 1
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# The process for clk2
|
29
|
+
timed do
|
30
|
+
80.times do
|
31
|
+
clk2 <= 0
|
32
|
+
!3.ns
|
33
|
+
clk2 <= 1
|
34
|
+
!3.ns
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# The control process
|
39
|
+
timed do
|
40
|
+
rst <= 0
|
41
|
+
button <= 0
|
42
|
+
!10.ns
|
43
|
+
rst <= 1
|
44
|
+
!20.ns
|
45
|
+
rst <= 0
|
46
|
+
!10.ns
|
47
|
+
10.times do
|
48
|
+
button <= 1
|
49
|
+
!20.ns
|
50
|
+
button <= 0
|
51
|
+
!20.ns
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# require "std/fixpoint.rb"
|
2
|
+
# require_relative "activation_function.rb"
|
3
|
+
require 'std/function_generator.rb'
|
4
|
+
|
5
|
+
include HDLRuby::High::Std
|
6
|
+
|
7
|
+
system :music do
|
8
|
+
|
9
|
+
input :clk, :rst
|
10
|
+
[24].output :sound
|
11
|
+
|
12
|
+
# func_sin = proc { |i| Math.sin(i) }
|
13
|
+
# More efficient:
|
14
|
+
func_sin = Math.method(:sin)
|
15
|
+
|
16
|
+
# bit[8,8].inner :time
|
17
|
+
# signed[2,22].inner :sin_val0
|
18
|
+
# signed[2,22].inner :sin_val1
|
19
|
+
bit[8].inner :time
|
20
|
+
signed[24].inner :sin_val0
|
21
|
+
signed[24].inner :sin_val1
|
22
|
+
|
23
|
+
# activation_function(func_sin,signed[2,22],8,8,16).(:func_sin0_generator).(time,sin_val0)
|
24
|
+
# activation_function(func_sin,signed[2,22],8,8,16).(:func_sin1_generator).(time/2,sin_val1)
|
25
|
+
function_generator(func_sin,bit[8],signed[24],4,-Math::PI..Math::PI,-2..2).(:func_sin0_generator).(time,sin_val0)
|
26
|
+
function_generator(func_sin,bit[8],signed[24],4,-Math::PI*2..Math::PI*2,-2..2).(:func_sin1_generator).(time/2,sin_val1)
|
27
|
+
|
28
|
+
# signed[2,22].inner :sound0
|
29
|
+
signed[48].inner :sound0
|
30
|
+
|
31
|
+
sound0 <= sin_val0.as(signed[24]) * sin_val1
|
32
|
+
|
33
|
+
sound <= sound0[47..24]
|
34
|
+
|
35
|
+
par(clk.posedge) do
|
36
|
+
hif(rst) { time <= 0 }
|
37
|
+
helse do
|
38
|
+
# time <= time + _0000000000000001
|
39
|
+
time <= time + _00000001
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
system :music_test do
|
49
|
+
|
50
|
+
inner :clk,:rst
|
51
|
+
[24].inner :sound
|
52
|
+
|
53
|
+
music(:my_music).(clk,rst,sound)
|
54
|
+
|
55
|
+
timed do
|
56
|
+
clk <= 0
|
57
|
+
rst <= 0
|
58
|
+
!10.ns
|
59
|
+
clk <= 1
|
60
|
+
!10.ns
|
61
|
+
clk <= 0
|
62
|
+
rst <= 1
|
63
|
+
!10.ns
|
64
|
+
clk <= 1
|
65
|
+
!10.ns
|
66
|
+
clk <= 0
|
67
|
+
!10.ns
|
68
|
+
clk <= 1
|
69
|
+
!10.ns
|
70
|
+
clk <= 0
|
71
|
+
rst <= 0
|
72
|
+
256.times do
|
73
|
+
!10.ns
|
74
|
+
clk <= 1
|
75
|
+
!10.ns
|
76
|
+
clk <= 0
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
##
|
2
|
+
# Sample testing named sub
|
3
|
+
#######################################
|
4
|
+
|
5
|
+
|
6
|
+
# A simple circuit with named sub
|
7
|
+
system :named_sub do
|
8
|
+
input :x, :y
|
9
|
+
output :s
|
10
|
+
|
11
|
+
sub :somesub do
|
12
|
+
inner :sig
|
13
|
+
end
|
14
|
+
|
15
|
+
seq do
|
16
|
+
somesub.sig <= x | y
|
17
|
+
s <= ~somesub.sig
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
# A benchmark for the circuit.
|
23
|
+
system :named_sub_bench do
|
24
|
+
inner :x, :y, :s
|
25
|
+
|
26
|
+
named_sub(:my_named_sub).(x,y,s)
|
27
|
+
|
28
|
+
timed do
|
29
|
+
x <= 0
|
30
|
+
y <= 0
|
31
|
+
!10.ns
|
32
|
+
x <= 1
|
33
|
+
y <= 0
|
34
|
+
!10.ns
|
35
|
+
x <= 0
|
36
|
+
y <= 1
|
37
|
+
!10.ns
|
38
|
+
x <= 1
|
39
|
+
y <= 1
|
40
|
+
!10.ns
|
41
|
+
end
|
42
|
+
end
|
@@ -14,3 +14,19 @@ system :rom4_8 do
|
|
14
14
|
data1 <= content1[addr]
|
15
15
|
data2 <= content2[addr]
|
16
16
|
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
system :test_rom do
|
21
|
+
[2..0].inner :addr
|
22
|
+
[7..0].inner :data0,:data1,:data2
|
23
|
+
|
24
|
+
rom4_8(:my_rom).(addr,data0,data1,data2)
|
25
|
+
|
26
|
+
timed do
|
27
|
+
8.times do |i|
|
28
|
+
addr <= i
|
29
|
+
!10.ns
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Test the type method min and max
|
2
|
+
|
3
|
+
# A benchmark for the adder.
|
4
|
+
system :adder_bench do
|
5
|
+
[32].inner :x
|
6
|
+
signed[32].inner :y
|
7
|
+
|
8
|
+
timed do
|
9
|
+
x <= 0
|
10
|
+
y <= 0
|
11
|
+
!10.ns
|
12
|
+
x <= bit[8].max
|
13
|
+
y <= signed[8].max
|
14
|
+
!10.ns
|
15
|
+
x <= bit[8].min
|
16
|
+
y <= signed[8].min
|
17
|
+
!10.ns
|
18
|
+
x <= bit[10].max
|
19
|
+
y <= signed[10].max
|
20
|
+
!10.ns
|
21
|
+
x <= bit[10].min
|
22
|
+
y <= signed[10].min
|
23
|
+
!10.ns
|
24
|
+
x <= bit[16].max
|
25
|
+
y <= signed[16].max
|
26
|
+
!10.ns
|
27
|
+
x <= bit[16].min
|
28
|
+
y <= signed[16].min
|
29
|
+
!10.ns
|
30
|
+
x <= bit[32].max
|
31
|
+
y <= signed[32].max
|
32
|
+
!10.ns
|
33
|
+
x <= bit[32].min
|
34
|
+
y <= signed[32].min
|
35
|
+
!10.ns
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'std/function_generator.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Std
|
4
|
+
|
5
|
+
# System for testing the function generator standard library.
|
6
|
+
system :with_function_generator do
|
7
|
+
# signed[8].inner :x
|
8
|
+
# signed[32].inner :y
|
9
|
+
bit[8].inner :x
|
10
|
+
signed[8].inner :y
|
11
|
+
|
12
|
+
# function_generator(Math.method(:sin).to_proc,
|
13
|
+
# signed[8],signed[32],4,-Math::PI..Math::PI,-2..2).
|
14
|
+
function_generator(Math.method(:sin).to_proc,
|
15
|
+
bit[8],signed[8],4,-Math::PI..Math::PI,-2..2).
|
16
|
+
(:my_sin).(x,y)
|
17
|
+
|
18
|
+
timed do
|
19
|
+
# (-128..127).each do |i|
|
20
|
+
(0..255).each do |i|
|
21
|
+
x <= i
|
22
|
+
!10.ns
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|