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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a207f3222cab832d2b846f9658ea0cf9426e77afd14196c2db8cb6832bd4ebda
4
- data.tar.gz: 490c8a6400d6faac77cec5ab1e49caa3abd94d4d0961521ec14d485cad640b72
3
+ metadata.gz: 2c66f2d8f552623dabccc43ea54a7246d49eb42a6aaf0f6b8a1977e7675221ca
4
+ data.tar.gz: 10f9b15022166b3fdb90a9a026653f3fec8b5a05f807e468dfed2d1c97d9adf7
5
5
  SHA512:
6
- metadata.gz: '08196d385fb34444cc7387f6b4982063c38e98e10e51e3b58551b0a6b62dac6921fcbb9c7a89aaccabea055ecab0d2da0543667f688d52bd7ea6b875d9db5ebd'
7
- data.tar.gz: c22296c840a2a7a52b8f4bd8bc34dc38c53f571feba0a01f1bb17a2f548c2965947916fcf47b95b33f2293f1481d8b91653d855c21708a746245cebffebc72f4
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 case statement.
3
+ # A benchmark for the if statement.
4
4
  system :if_bench do
5
- [8].inner :x, :y
5
+ [8].inner :x, :z
6
6
 
7
7
  par do
8
8
  hcase(x)
9
- hwhen(0) { y <= _10000000 }
10
- hwhen(1) { y <= _10000001 }
11
- hwhen(2) { y <= _10000010 }
12
- hwhen(3) { y <= _10000011 }
13
- helse { y <= _00000000 }
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