HDLRuby 3.1.0 → 3.3.0
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/HDLRuby.gemspec +1 -0
- data/README.html +2330 -2670
- data/README.md +400 -100
- data/ext/hruby_sim/hruby_rcsim_build.c +402 -3
- data/ext/hruby_sim/hruby_sim.h +2 -1
- data/ext/hruby_sim/hruby_sim_calc.c +34 -7
- data/ext/hruby_sim/hruby_sim_core.c +15 -5
- data/ext/hruby_sim/hruby_sim_tree_calc.c +112 -23
- data/lib/HDLRuby/hdr_samples/c_program/echo.c +33 -0
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
- data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
- data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
- data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
- data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/echo.rb +9 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/stdrw.rb +6 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_cpu_terminal.rb +614 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_inc_mem.rb +32 -0
- data/lib/HDLRuby/hdr_samples/ruby_program/sw_log.rb +33 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
- data/lib/HDLRuby/hdr_samples/with_board.rb +63 -0
- data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
- data/lib/HDLRuby/hdr_samples/with_clocks.rb +42 -0
- data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_of.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_program_c.rb +28 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby.rb +28 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_cpu.rb +234 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_io.rb +23 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_mem.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_program_ruby_threads.rb +56 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +10 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +18 -4
- data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +2 -4
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
- data/lib/HDLRuby/hdrcc.rb +72 -21
- data/lib/HDLRuby/hruby_error.rb +13 -0
- data/lib/HDLRuby/hruby_high.rb +125 -26
- data/lib/HDLRuby/hruby_low.rb +171 -3
- data/lib/HDLRuby/hruby_low2programs.rb +47 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
- data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +1 -1
- data/lib/HDLRuby/hruby_rcsim.rb +113 -6
- data/lib/HDLRuby/hruby_serializer.rb +2 -1
- data/lib/HDLRuby/hruby_verilog.rb +94 -20
- data/lib/HDLRuby/hruby_verilog_name.rb +3 -17
- data/lib/HDLRuby/std/clocks.rb +118 -50
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/function_generator.rb +1 -1
- data/lib/HDLRuby/std/linear.rb +7 -7
- data/lib/HDLRuby/std/sequencer.rb +263 -13
- data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
- data/lib/HDLRuby/std/sequencer_func.rb +28 -15
- data/lib/HDLRuby/std/std.rb +6 -0
- data/lib/HDLRuby/ui/hruby_board.rb +1079 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/lib/c/Rakefile +8 -0
- data/lib/c/cHDL.h +12 -0
- data/lib/c/extconf.rb +7 -0
- data/lib/rubyHDL.rb +33 -0
- data/tuto/gui_accum.png +0 -0
- data/tuto/gui_board.png +0 -0
- data/tuto/tutorial_sw.html +2263 -1890
- data/tuto/tutorial_sw.md +957 -62
- metadata +43 -5
- data/README.pdf +0 -0
- data/tuto/tutorial_sw.pdf +0 -0
data/lib/HDLRuby/std/clocks.rb
CHANGED
|
@@ -4,10 +4,10 @@ module HDLRuby::High::Std
|
|
|
4
4
|
# Standard HDLRuby::High library: clocks
|
|
5
5
|
#
|
|
6
6
|
########################################################################
|
|
7
|
-
|
|
7
|
+
@@__clocks_rst = nil
|
|
8
8
|
|
|
9
9
|
# Initialize the clock generator with +rst+ as reset signal.
|
|
10
|
-
def configure_clocks(rst =
|
|
10
|
+
def configure_clocks(rst = nil)
|
|
11
11
|
@@__clocks_rst = rst
|
|
12
12
|
end
|
|
13
13
|
|
|
@@ -19,13 +19,22 @@ module HDLRuby::High::Std
|
|
|
19
19
|
HDLRuby::High.cur_system.open do
|
|
20
20
|
|
|
21
21
|
# Ensures times is a value.
|
|
22
|
-
times = times.to_value
|
|
22
|
+
times = times.to_value - 1
|
|
23
|
+
if (times == 0) then
|
|
24
|
+
AnyError.new("Clock multiplier must be >= 2.")
|
|
25
|
+
end
|
|
23
26
|
|
|
24
27
|
# Create the counter.
|
|
25
28
|
# Create the name of the counter.
|
|
26
29
|
name = HDLRuby.uniq_name
|
|
27
30
|
# Declare the counter.
|
|
28
|
-
|
|
31
|
+
if @@__clocks_rst then
|
|
32
|
+
# There is a reset, so no need to initialize.
|
|
33
|
+
[times.width].inner(name)
|
|
34
|
+
else
|
|
35
|
+
# There is no reset, so need to initialize.
|
|
36
|
+
[times.width].inner(name => times)
|
|
37
|
+
end
|
|
29
38
|
# Get the signal of the counter.
|
|
30
39
|
counter = get_inner(name)
|
|
31
40
|
|
|
@@ -33,51 +42,77 @@ module HDLRuby::High::Std
|
|
|
33
42
|
# Create the name of the clock.
|
|
34
43
|
name = HDLRuby.uniq_name
|
|
35
44
|
# Declares the clock.
|
|
36
|
-
|
|
45
|
+
if @@__clocks_rst then
|
|
46
|
+
# There is a reset, so no need to initialize.
|
|
47
|
+
bit.inner(name)
|
|
48
|
+
else
|
|
49
|
+
# There is no reset, so need to initialize.
|
|
50
|
+
bit.inner(name => times)
|
|
51
|
+
end
|
|
37
52
|
# Get the signal of the clock.
|
|
38
53
|
clock = get_inner(name)
|
|
39
54
|
|
|
40
55
|
# Control it.
|
|
41
56
|
par(event) do
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
if @@__clocks_rst then
|
|
58
|
+
# There is a reset, handle it.
|
|
59
|
+
hif(@@__clocks_rst) do
|
|
60
|
+
counter <= times
|
|
61
|
+
clock <= 0
|
|
62
|
+
end
|
|
63
|
+
helsif(counter.to_expr == 0) do
|
|
64
|
+
counter <= times
|
|
65
|
+
clock <= ~ clock
|
|
66
|
+
end
|
|
67
|
+
helse do
|
|
68
|
+
counter <= counter - 1
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
# There is no reset.
|
|
72
|
+
hif(counter == 0) do
|
|
73
|
+
counter <= times
|
|
74
|
+
clock <= ~ clock
|
|
75
|
+
end
|
|
76
|
+
helse do
|
|
77
|
+
counter <= counter - 1
|
|
78
|
+
end
|
|
52
79
|
end
|
|
53
80
|
end
|
|
54
81
|
end
|
|
55
82
|
return clock
|
|
56
83
|
end
|
|
57
84
|
|
|
58
|
-
# module clk_div3(clk,reset, clk_out);
|
|
59
|
-
|
|
60
|
-
# input clk;
|
|
61
|
-
# input reset;
|
|
62
|
-
# output clk_out;
|
|
63
|
-
|
|
64
|
-
# reg [1:0] pos_count, neg_count;
|
|
65
|
-
# wire [1:0] r_nxt;
|
|
66
|
-
|
|
67
|
-
# always @(posedge clk)
|
|
68
|
-
# if (reset)
|
|
69
|
-
# pos_count <=0;
|
|
70
|
-
# else if (pos_count ==2) pos_count <= 0;
|
|
71
|
-
# else pos_count<= pos_count +1;
|
|
72
85
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
86
|
+
# https://referencedesigner.com/tutorials/verilogexamples/verilog_ex_07.php
|
|
87
|
+
#
|
|
88
|
+
# module clk_divn #(
|
|
89
|
+
# parameter WIDTH = 3,
|
|
90
|
+
# parameter N = 5)
|
|
91
|
+
#
|
|
92
|
+
# (clk,reset, clk_out);
|
|
93
|
+
#
|
|
94
|
+
# input clk;
|
|
95
|
+
# input reset;
|
|
96
|
+
# output clk_out;
|
|
97
|
+
#
|
|
98
|
+
# reg [WIDTH-1:0] pos_count, neg_count;
|
|
99
|
+
# wire [WIDTH-1:0] r_nxt;
|
|
100
|
+
#
|
|
101
|
+
# always @(posedge clk)
|
|
102
|
+
# if (reset)
|
|
103
|
+
# pos_count <=0;
|
|
104
|
+
# else if (pos_count ==N-1) pos_count <= 0;
|
|
105
|
+
# else pos_count<= pos_count +1;
|
|
106
|
+
#
|
|
107
|
+
# always @(negedge clk)
|
|
108
|
+
# if (reset)
|
|
109
|
+
# neg_count <=0;
|
|
110
|
+
# else if (neg_count ==N-1) neg_count <= 0;
|
|
111
|
+
# else neg_count<= neg_count +1;
|
|
112
|
+
#
|
|
113
|
+
# assign clk_out = ((pos_count > (N>>1)) | (neg_count > (N>>1)));
|
|
114
|
+
# endmodule
|
|
78
115
|
|
|
79
|
-
# assign clk_out = ((pos_count == 2) | (neg_count == 2));
|
|
80
|
-
# endmodule
|
|
81
116
|
|
|
82
117
|
# Creates a clock inverted every +times+ occurence of an +event+ and its
|
|
83
118
|
# everted.
|
|
@@ -87,13 +122,22 @@ module HDLRuby::High::Std
|
|
|
87
122
|
# Enters the current system
|
|
88
123
|
HDLRuby::High.cur_system.open do
|
|
89
124
|
# Ensure times is a value.
|
|
90
|
-
times = times.to_value
|
|
125
|
+
times = times.to_value
|
|
126
|
+
if (times == 1) then
|
|
127
|
+
AnyError.new("Clock multiplier must be >= 2.")
|
|
128
|
+
end
|
|
91
129
|
|
|
92
130
|
# Create the event counter.
|
|
93
131
|
# Create the name of the counter.
|
|
94
132
|
name = HDLRuby.uniq_name
|
|
95
133
|
# Declare the counter.
|
|
96
|
-
|
|
134
|
+
if @@__clocks_rst then
|
|
135
|
+
# There is a reset, so no need to initialize.
|
|
136
|
+
[times.width].inner(name)
|
|
137
|
+
else
|
|
138
|
+
# There is no reset, so need to initialize.
|
|
139
|
+
[times.width].inner(name => 0)
|
|
140
|
+
end
|
|
97
141
|
# Get the signal of the counter.
|
|
98
142
|
counter = get_inner(name)
|
|
99
143
|
|
|
@@ -101,7 +145,13 @@ module HDLRuby::High::Std
|
|
|
101
145
|
# Create the name of the counter.
|
|
102
146
|
name = HDLRuby.uniq_name
|
|
103
147
|
# Declare the counter.
|
|
104
|
-
|
|
148
|
+
if @@__clocks_rst then
|
|
149
|
+
# There is a reset, so no need to initialize.
|
|
150
|
+
[times.width].inner(name)
|
|
151
|
+
else
|
|
152
|
+
# There is no reset, so need to initialize.
|
|
153
|
+
[times.width].inner(name => 0)
|
|
154
|
+
end
|
|
105
155
|
# Get the signal of the counter.
|
|
106
156
|
counter_inv = get_inner(name)
|
|
107
157
|
|
|
@@ -109,32 +159,50 @@ module HDLRuby::High::Std
|
|
|
109
159
|
# Create the name of the clock.
|
|
110
160
|
name = HDLRuby.uniq_name
|
|
111
161
|
# Declare the clock.
|
|
112
|
-
|
|
162
|
+
if @@__clocks_rst then
|
|
163
|
+
# There is a reset, so no need to initialize.
|
|
164
|
+
bit.inner(name)
|
|
165
|
+
else
|
|
166
|
+
# There is no reset, so need to initialize.
|
|
167
|
+
bit.inner(name => 0)
|
|
168
|
+
end
|
|
113
169
|
# Get the signal of the clock.
|
|
114
170
|
clock = get_inner(name)
|
|
115
171
|
|
|
116
|
-
# Control the
|
|
172
|
+
# Control the even counter.
|
|
117
173
|
par(event) do
|
|
118
|
-
|
|
119
|
-
counter
|
|
174
|
+
if @@__clocks_rst then
|
|
175
|
+
hif(@@__clocks_rst) { counter <= 0 }
|
|
176
|
+
helsif(counter == times-1) { counter <= 0 }
|
|
177
|
+
helse { counter <= counter + 1 }
|
|
178
|
+
else
|
|
179
|
+
hif(counter == times-1) { counter <= 0 }
|
|
180
|
+
helse { counter <= counter + 1 }
|
|
120
181
|
end
|
|
121
182
|
end
|
|
122
|
-
|
|
183
|
+
|
|
184
|
+
# Control the odd counter.
|
|
123
185
|
par(event.invert) do
|
|
124
|
-
|
|
125
|
-
counter_inv
|
|
186
|
+
if @@__clocks_rst then
|
|
187
|
+
hif(@@__clocks_rst) { counter_inv <= 0 }
|
|
188
|
+
helsif(counter == times-1) { counter_inv <= 0 }
|
|
189
|
+
helse { counter_inv <= counter_inv + 1 }
|
|
190
|
+
else
|
|
191
|
+
hif(counter == times-1) { counter_inv <= 0 }
|
|
192
|
+
helse { counter_inv <= counter_inv + 1 }
|
|
126
193
|
end
|
|
127
194
|
end
|
|
128
|
-
|
|
129
|
-
clock
|
|
130
|
-
(counter_inv.to_expr == times.to_expr/2 + 1)
|
|
195
|
+
|
|
196
|
+
clock <= ((counter > (times/2)) | (counter_inv > (times/2)))
|
|
131
197
|
end
|
|
132
|
-
# Return
|
|
198
|
+
# Return the clock.
|
|
133
199
|
return clock
|
|
134
200
|
end
|
|
201
|
+
|
|
135
202
|
end
|
|
136
203
|
|
|
137
204
|
|
|
205
|
+
|
|
138
206
|
class HDLRuby::High::Event
|
|
139
207
|
# Enhance the events with multiply operator.
|
|
140
208
|
|
data/lib/HDLRuby/std/fixpoint.rb
CHANGED
|
@@ -53,9 +53,9 @@ module HDLRuby::High::Std
|
|
|
53
53
|
# Redefine the multiplication and division for fixed point.
|
|
54
54
|
typ.define_operator(:*) do |left,right|
|
|
55
55
|
if (typ.signed?) then
|
|
56
|
-
(left.as(signed[isize+fsize*2])*right) >> fsize
|
|
56
|
+
((left.as(signed[isize+fsize*2])*right) >> fsize).as(typ)
|
|
57
57
|
else
|
|
58
|
-
(left.as(bit[isize+fsize*2])*right) >> fsize
|
|
58
|
+
((left.as(bit[isize+fsize*2])*right) >> fsize).as(typ)
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
typ.define_operator(:/) do |left,right|
|
data/lib/HDLRuby/std/linear.rb
CHANGED
|
@@ -16,7 +16,7 @@ module HDLRuby::High::Std
|
|
|
16
16
|
# - +ruby_block+: the code of the linear computation kernel, it takes
|
|
17
17
|
# as argument +ev+, and its own req and ack signals
|
|
18
18
|
# (resp. +req_ker+ +ack_ker+).
|
|
19
|
-
|
|
19
|
+
hdef :linearun do |num,ev,req,ack,ruby_block|
|
|
20
20
|
# Ensure ev is really an event.
|
|
21
21
|
ev = ev.posedge unless ev.is_a?(Event)
|
|
22
22
|
|
|
@@ -57,7 +57,7 @@ module HDLRuby::High::Std
|
|
|
57
57
|
# Delcares a vector product by a scalar value.
|
|
58
58
|
#
|
|
59
59
|
# Can be used for scaling a vector.
|
|
60
|
-
|
|
60
|
+
hdef :scale do |typ,ev,req,ack,left,rights,prods,
|
|
61
61
|
mul = proc { |x,y| x*y }|
|
|
62
62
|
# Ensure ev is really an event.
|
|
63
63
|
ev = ev.posedge unless ev.is_a?(Event)
|
|
@@ -101,7 +101,7 @@ module HDLRuby::High::Std
|
|
|
101
101
|
# Declares a 1-dimension vector adder.
|
|
102
102
|
#
|
|
103
103
|
# Can be used for the sum of two vectors.
|
|
104
|
-
|
|
104
|
+
hdef :add_n do |typ,ev,req,ack,lefts, rights, sums,
|
|
105
105
|
add = proc { |x,y| x+y }|
|
|
106
106
|
# Ensure ev is really an event.
|
|
107
107
|
ev = ev.posedge unless ev.is_a?(Event)
|
|
@@ -143,7 +143,7 @@ module HDLRuby::High::Std
|
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
# Declares a 1-dimension vector element-wise multiplier.
|
|
146
|
-
|
|
146
|
+
hdef :mul_n do |typ,ev,req,ack,lefts, rights, prods,
|
|
147
147
|
mul = proc { |x,y| x*y }|
|
|
148
148
|
add_n(typ,ev,req,ack,lefts,rights,prods,mul)
|
|
149
149
|
end
|
|
@@ -152,7 +152,7 @@ module HDLRuby::High::Std
|
|
|
152
152
|
# Declares a simple multiplier accumulator.
|
|
153
153
|
#
|
|
154
154
|
# Can be used for the scalar product of two vectors.
|
|
155
|
-
|
|
155
|
+
hdef :mac do |typ,ev,req,ack,left, right, acc,
|
|
156
156
|
mul = proc { |x,y| x*y }, add = proc { |x,y| x+y }|
|
|
157
157
|
# Ensure ev is really an event.
|
|
158
158
|
ev = ev.posedge unless ev.is_a?(Event)
|
|
@@ -193,7 +193,7 @@ module HDLRuby::High::Std
|
|
|
193
193
|
# Declares a simple multiple mac with single right data.
|
|
194
194
|
#
|
|
195
195
|
# Can be used for the product of a martix-vector product.
|
|
196
|
-
|
|
196
|
+
hdef :mac_n1 do |typ,ev,req,ack,lefts, right, accs,
|
|
197
197
|
mul = proc { |x,y| x*y }, add = proc { |x,y| x+y }|
|
|
198
198
|
# Ensure ev is really an event.
|
|
199
199
|
ev = ev.posedge unless ev.is_a?(Event)
|
|
@@ -262,7 +262,7 @@ module HDLRuby::High::Std
|
|
|
262
262
|
# Declares a simple pipelined multiple mac with single right data.
|
|
263
263
|
#
|
|
264
264
|
# Can be used for the product of a martix-vector product.
|
|
265
|
-
|
|
265
|
+
hdef :mac_np do |typ,ev,req,ack,lefts, rights, last,
|
|
266
266
|
mul = proc { |x,y| x*y }, add = proc { |x,y| x+y }|
|
|
267
267
|
# Ensure ev is really an event.
|
|
268
268
|
ev = ev.posedge unless ev.is_a?(Event)
|