HDLRuby 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +139 -79
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +2 -1
- data/lib/HDLRuby/hdr_samples/with_ref_expr.rb +30 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +32 -37
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +103 -69
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +10 -10
- data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +63 -0
- data/lib/HDLRuby/hdrcc.rb +1 -1
- data/lib/HDLRuby/hruby_high.rb +23 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +50 -11
- data/lib/HDLRuby/hruby_types.rb +5 -5
- data/lib/HDLRuby/hruby_values.rb +7 -7
- data/lib/HDLRuby/hruby_verilog.rb +101 -17
- data/lib/HDLRuby/hruby_verilog_name.rb +49 -42
- data/lib/HDLRuby/std/fsm.rb +10 -1
- data/lib/HDLRuby/std/sequencer.rb +281 -53
- data/lib/HDLRuby/std/sequencer_func.rb +533 -0
- data/lib/HDLRuby/std/std.rb +1 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.md +267 -61
- metadata +5 -3
- data/lib/HDLRuby/hdr_samples/with_register_stack.rb +0 -150
@@ -16,34 +16,34 @@ system :my_seqencer do
|
|
16
16
|
[8].inner :res0, :res1
|
17
17
|
|
18
18
|
sequencer(clk.posedge,rst) do
|
19
|
-
hprint("#0\n")
|
19
|
+
# hprint("#0\n")
|
20
20
|
res0 <= 0
|
21
21
|
res1 <= 0
|
22
22
|
res0 <= vals.ssum
|
23
23
|
res1 <= res0.ssum(_h00)
|
24
|
-
hprint("#1 res0=",res0," res1=",res1,"\n")
|
24
|
+
# hprint("#1 res0=",res0," res1=",res1,"\n")
|
25
25
|
end
|
26
26
|
|
27
27
|
[8].inner :res2, :res3
|
28
28
|
|
29
29
|
sequencer(clk.posedge,rst) do
|
30
|
-
hprint("$0\n")
|
30
|
+
# hprint("$0\n")
|
31
31
|
res2 <= 0
|
32
32
|
res3 <= 0
|
33
|
-
res2 <= (1..5).
|
33
|
+
res2 <= (1..5).ssum(_h00)
|
34
34
|
res3 <= (res3..res2).ssum
|
35
|
-
hprint("$1 res2=",res2," res3=",res3,"\n")
|
35
|
+
# hprint("$1 res2=",res2," res3=",res3,"\n")
|
36
36
|
end
|
37
37
|
|
38
38
|
[8].inner :res4, :res5
|
39
39
|
|
40
40
|
sequencer(clk.posedge,rst) do
|
41
|
-
hprint("!0\n")
|
41
|
+
# hprint("!0\n")
|
42
42
|
res4 <= 0
|
43
43
|
res5 <= 0
|
44
44
|
res4 <= [_h01,_h02,_h03,_h04].ssum
|
45
|
-
res5 <= [1,2,3,4,5].ssum
|
46
|
-
hprint("!1 res4=",res4," res5=",res5,"\n")
|
45
|
+
res5 <= [1,2,3,4,5].ssum(_h00)
|
46
|
+
# hprint("!1 res4=",res4," res5=",res5,"\n")
|
47
47
|
end
|
48
48
|
|
49
49
|
bit[8][-8].inner mem: [ _h01, _h02, _h03, _h04, _h30, _h30, _h30, _h30 ]
|
@@ -59,10 +59,10 @@ system :my_seqencer do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
sequencer(clk.posedge,rst) do
|
62
|
-
hprint("~0\n")
|
62
|
+
# hprint("~0\n")
|
63
63
|
res6 <= 0
|
64
64
|
res6 <= mem_enum.ssum
|
65
|
-
hprint("~1 res6=",res6,"\n")
|
65
|
+
# hprint("~1 res6=",res6,"\n")
|
66
66
|
end
|
67
67
|
|
68
68
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'std/sequencer_func.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Std
|
4
|
+
|
5
|
+
|
6
|
+
# A factorial with default stack depth.
|
7
|
+
sdef(:fact) do |n|
|
8
|
+
hprint("n=",n,"\n")
|
9
|
+
sif(n > 1) { sreturn(n*fact(n-1,20)) } #Recurse setting the stack depth to 20
|
10
|
+
selse { sreturn(1) }
|
11
|
+
end
|
12
|
+
|
13
|
+
# A factiorial with very low stack depth for checking overflow.
|
14
|
+
sdef(:fact_over,2,proc { stack_overflow_error <= 1 }) do |n|
|
15
|
+
hprint("n2=",n,"\n")
|
16
|
+
sif(n > 1) { sreturn(n*fact_over(n-1)) }
|
17
|
+
selse { sreturn(1) }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Checking the usage of sequencers functions.
|
21
|
+
system :my_seqencer do
|
22
|
+
|
23
|
+
inner :clk,:rst
|
24
|
+
|
25
|
+
[16].inner :val
|
26
|
+
[16].inner :res
|
27
|
+
|
28
|
+
inner stack_overflow_error: 0
|
29
|
+
|
30
|
+
sequencer(clk.posedge,rst) do
|
31
|
+
5.stimes do |i|
|
32
|
+
val <= i
|
33
|
+
res <= fact(val)
|
34
|
+
end
|
35
|
+
hprint("Going to overflow...\n")
|
36
|
+
4.stimes do |i|
|
37
|
+
val <= i
|
38
|
+
res <= fact_over(val)
|
39
|
+
end
|
40
|
+
hprint("stack_overflow_error=",stack_overflow_error,"\n")
|
41
|
+
end
|
42
|
+
|
43
|
+
timed do
|
44
|
+
clk <= 0
|
45
|
+
rst <= 0
|
46
|
+
!10.ns
|
47
|
+
clk <= 1
|
48
|
+
!10.ns
|
49
|
+
clk <= 0
|
50
|
+
rst <= 1
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
!10.ns
|
54
|
+
clk <= 0
|
55
|
+
rst <= 0
|
56
|
+
!10.ns
|
57
|
+
clk <= 1
|
58
|
+
repeat(500) do
|
59
|
+
!10.ns
|
60
|
+
clk <= ~clk
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/HDLRuby/hdrcc.rb
CHANGED
@@ -821,7 +821,7 @@ elsif $options[:verilog] then
|
|
821
821
|
$top_system.each_systemT_deep do |systemT|
|
822
822
|
HDLRuby.show? "signal2subs step..."
|
823
823
|
# Ensure there is not implicit assign to sub signals.
|
824
|
-
systemT.signal2subs!
|
824
|
+
systemT.signal2subs!(true)
|
825
825
|
# HDLRuby.show "casts_without_expression! step..."
|
826
826
|
# systemT.casts_without_expression!
|
827
827
|
# HDLRuby.show Time.now
|
data/lib/HDLRuby/hruby_high.rb
CHANGED
@@ -2198,29 +2198,48 @@ module HDLRuby::High
|
|
2198
2198
|
#
|
2199
2199
|
# NOTE: a function is a short-cut for a method that creates a scope.
|
2200
2200
|
def function(name, &ruby_block)
|
2201
|
+
warn("Construct 'function' is deprecated, use 'hdef' instead.")
|
2201
2202
|
# Ensure there is a block.
|
2202
2203
|
ruby_block = proc {} unless block_given?
|
2203
2204
|
if HDLRuby::High.in_system? then
|
2204
2205
|
define_singleton_method(name.to_sym) do |*args,&other_block|
|
2205
|
-
# sub do
|
2206
2206
|
sub(HDLRuby.uniq_name(name)) do
|
2207
2207
|
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
2208
2208
|
&ruby_block)
|
2209
|
-
# ruby_block.call(*args)
|
2210
2209
|
end
|
2211
2210
|
end
|
2212
2211
|
else
|
2213
2212
|
define_method(name.to_sym) do |*args,&other_block|
|
2214
|
-
# sub do
|
2215
2213
|
sub(HDLRuby.uniq_name(name)) do
|
2216
2214
|
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
2217
2215
|
&ruby_block)
|
2218
|
-
# ruby_block.call(*args,*other_block)
|
2219
2216
|
end
|
2220
2217
|
end
|
2221
2218
|
end
|
2222
2219
|
end
|
2223
2220
|
|
2221
|
+
# Declares a function named +name+ using +ruby_block+ as body.
|
2222
|
+
#
|
2223
|
+
# NOTE: a function is a short-cut for a method that creates a scope.
|
2224
|
+
def hdef(name, &ruby_block)
|
2225
|
+
# Ensure there is a block.
|
2226
|
+
ruby_block = proc {} unless block_given?
|
2227
|
+
if HDLRuby::High.in_system? then
|
2228
|
+
define_singleton_method(name.to_sym) do |*args,&other_block|
|
2229
|
+
sub(HDLRuby.uniq_name(name)) do
|
2230
|
+
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
2231
|
+
&ruby_block)
|
2232
|
+
end
|
2233
|
+
end
|
2234
|
+
else
|
2235
|
+
define_method(name.to_sym) do |*args,&other_block|
|
2236
|
+
sub(HDLRuby.uniq_name(name)) do
|
2237
|
+
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
2238
|
+
&ruby_block)
|
2239
|
+
end
|
2240
|
+
end
|
2241
|
+
end
|
2242
|
+
end
|
2224
2243
|
|
2225
2244
|
|
2226
2245
|
|
@@ -3134,7 +3153,6 @@ module HDLRuby::High
|
|
3134
3153
|
|
3135
3154
|
# Converts the unary expression to HDLRuby::Low.
|
3136
3155
|
def to_low
|
3137
|
-
# return HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
|
3138
3156
|
castL =HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
|
3139
3157
|
# # For debugging: set the source high object
|
3140
3158
|
# castL.properties[:low2high] = self.hdr_id
|
@@ -18,10 +18,24 @@ module HDLRuby::Low
|
|
18
18
|
## Extends the SystemT class with functionality for decomposing the
|
19
19
|
# hierachical signals in the statements.
|
20
20
|
|
21
|
+
# # Decompose the hierarchical signals in the statements.
|
22
|
+
# def signal2subs!
|
23
|
+
# self.scope.signal2subs!
|
24
|
+
# end
|
25
|
+
|
21
26
|
# Decompose the hierarchical signals in the statements.
|
22
|
-
|
27
|
+
# If +decompose_vec2d+ is true then also decompose 2 dimension vectors
|
28
|
+
# (e.g., for Verilog HDL that does not support handling such signals
|
29
|
+
# as usual expressions).
|
30
|
+
def signal2subs!(decompose_vec2d = false)
|
31
|
+
@@decompose_vec2d = decompose_vec2d == true
|
23
32
|
self.scope.signal2subs!
|
24
33
|
end
|
34
|
+
|
35
|
+
## Tell if 2d vector signals must be decomposed too.
|
36
|
+
def self.decompose_vec2d?
|
37
|
+
@@decompose_vec2d
|
38
|
+
end
|
25
39
|
end
|
26
40
|
|
27
41
|
|
@@ -230,16 +244,41 @@ module HDLRuby::Low
|
|
230
244
|
# from signal +sig+ and add to result to +subrefs+
|
231
245
|
def flatten_to(sig,subrefs)
|
232
246
|
# puts "flatten_to with sig name=#{sig.name}"
|
233
|
-
#
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
#
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
247
|
+
# Shall we decompose 2d vectors, and is the current signal
|
248
|
+
# for one of them?
|
249
|
+
if SystemT.decompose_vec2d? and sig.type.is_a?(TypeVector) and
|
250
|
+
sig.type.base.is_a?(TypeVector) then
|
251
|
+
# Is the reference used other than for a memory access?
|
252
|
+
unless self.parent.is_a?(RefIndex) then
|
253
|
+
# Yes, do the decomposition.
|
254
|
+
# Selects the direction.
|
255
|
+
rng = sig.type.range
|
256
|
+
if rng.first > rng.last then
|
257
|
+
itr = (rng.last..rng.first).each
|
258
|
+
else
|
259
|
+
itr = rng.reverse_each
|
260
|
+
end
|
261
|
+
# Iterate on each element.
|
262
|
+
itr.each do |i|
|
263
|
+
# Create a reference fo the sub.
|
264
|
+
subref = RefIndex.new(sig.type.base,self.clone,
|
265
|
+
Value.new(TypeUnsigned.new(:""),i))
|
266
|
+
# Add it.
|
267
|
+
subrefs << subref
|
268
|
+
end
|
269
|
+
end
|
270
|
+
else
|
271
|
+
# Work on the sub signals if any.
|
272
|
+
sig.each_signal do |sub|
|
273
|
+
# Create a reference for the sub.
|
274
|
+
subref = RefName.new(sub.type,self.clone,sub.name)
|
275
|
+
# Recurse on it.
|
276
|
+
subref.flatten_to(sub,subrefs)
|
277
|
+
# Was it a leaf?
|
278
|
+
unless sub.each_signal.any? then
|
279
|
+
# Yes, add its new ref to the list of subs.
|
280
|
+
subrefs << subref
|
281
|
+
end
|
243
282
|
end
|
244
283
|
end
|
245
284
|
end
|
data/lib/HDLRuby/hruby_types.rb
CHANGED
@@ -42,13 +42,13 @@ module HDLRuby
|
|
42
42
|
elsif type.float? then
|
43
43
|
return type
|
44
44
|
elsif self.signed? then
|
45
|
-
|
45
|
+
if type.signed? then
|
46
|
+
return self.width >= type.width ? self : type
|
47
|
+
else
|
48
|
+
return self
|
49
|
+
end
|
46
50
|
elsif type.signed? then
|
47
51
|
return type
|
48
|
-
elsif self.unsigned? then
|
49
|
-
return self
|
50
|
-
elsif type.unsigned? then
|
51
|
-
return type
|
52
52
|
elsif self.width >= type.width then
|
53
53
|
return self
|
54
54
|
else
|
data/lib/HDLRuby/hruby_values.rb
CHANGED
@@ -253,6 +253,7 @@ module HDLRuby
|
|
253
253
|
# Cast to +type+.
|
254
254
|
# NOTE: nodir tells if the direction is to be ignored.
|
255
255
|
def cast(type,nodir = false)
|
256
|
+
# puts "cast with content=#{self.content} type.signed=#{type.signed?} type.width=#{type.width}"
|
256
257
|
# Handle the direction.
|
257
258
|
if !nodir && type.direction != self.type.direction then
|
258
259
|
if self.content.is_a?(Numeric) then
|
@@ -281,19 +282,18 @@ module HDLRuby
|
|
281
282
|
res_content.positive!
|
282
283
|
end
|
283
284
|
end
|
284
|
-
if type.signed && res_content.is_a?(Numeric) && res_content >= (1 << (type.width-1)) then
|
285
|
+
if type.signed? && res_content.is_a?(Numeric) && res_content >= (1 << (type.width-1)) then
|
285
286
|
res_content = (-1 << type.width) + res_content
|
286
287
|
end
|
287
|
-
# # truncs to the right size if necessary.
|
288
|
-
# if res_content.is_a?(BitString) then
|
289
|
-
# res_content.trunc!(type.width)
|
290
|
-
# else
|
291
|
-
# res_content = self.trunc(res_content,type.width)
|
292
|
-
# end
|
293
288
|
# Generate the resulting value.
|
289
|
+
# puts "res_content=#{res_content}"
|
294
290
|
return self.class.new(type,res_content)
|
295
291
|
end
|
296
292
|
|
293
|
+
def as(typ)
|
294
|
+
return self.cast(typ)
|
295
|
+
end
|
296
|
+
|
297
297
|
# Concat the content of +vals+.
|
298
298
|
def self.concat(*vals)
|
299
299
|
# Compute the resulting type.
|
@@ -89,10 +89,10 @@ module HDLRuby::Low
|
|
89
89
|
# Convert the ranges to arrays.
|
90
90
|
rngI,rngS = self.r2a(rngI), self.r2a(rngS)
|
91
91
|
# Generate the name.
|
92
|
-
return "
|
92
|
+
return "truncer_#{rngI[0]}_#{rngI[1]}_#{rngS[0]}_#{rngS[1]}"
|
93
93
|
end
|
94
94
|
|
95
|
-
# Generate the truncating
|
95
|
+
# Generate the truncating functions.
|
96
96
|
def dump
|
97
97
|
# Ensure there is only one truncating function per range.
|
98
98
|
@truncers.sort!.uniq!
|
@@ -117,6 +117,53 @@ module HDLRuby::Low
|
|
117
117
|
TruncersI = Truncers.new
|
118
118
|
|
119
119
|
|
120
|
+
# Class for generating the truncating functions in verilog.
|
121
|
+
# Such function are necessary as expression cannot be truncated directly.
|
122
|
+
class Indexers
|
123
|
+
def initialize
|
124
|
+
@indexers = []
|
125
|
+
end
|
126
|
+
|
127
|
+
# Add an indexer to of expression of verilog type +typI+ returning
|
128
|
+
# verilog type +typR+.
|
129
|
+
def add(typI,typR)
|
130
|
+
# Add them
|
131
|
+
@indexers << [typI,typR]
|
132
|
+
end
|
133
|
+
alias_method :<<, :add
|
134
|
+
|
135
|
+
|
136
|
+
# Generate an indexer function name for expression of verilog type
|
137
|
+
# +typI+ returning verilog type +typR+.
|
138
|
+
def indexer_name(typI,typR)
|
139
|
+
# Generate the name.
|
140
|
+
return "indexer_#{name_to_verilog(typI)}_#{name_to_verilog(typR)}"
|
141
|
+
end
|
142
|
+
|
143
|
+
# Generate the indexing functions.
|
144
|
+
def dump
|
145
|
+
# Ensure there is only one indexing function per range.
|
146
|
+
@indexers.sort!.uniq!
|
147
|
+
# Generate the resulting code.
|
148
|
+
codeT = ""
|
149
|
+
@indexers.each do |(typI,typR)|
|
150
|
+
codeT << " function #{typR} "
|
151
|
+
codeT << self.indexer_name(typI,typR)
|
152
|
+
codeT << "(input #{typI} val, input integer idx);\n"
|
153
|
+
codeT << " " << self.indexer_name(typI,typR) << " = "
|
154
|
+
codeT << "val[idx];\n"
|
155
|
+
codeT << " endfunction\n\n"
|
156
|
+
end
|
157
|
+
# Clears the indexers.
|
158
|
+
@indexers = []
|
159
|
+
return codeT
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# Declaration of the truncating function generator.
|
164
|
+
IndexersI = Indexers.new
|
165
|
+
|
166
|
+
|
120
167
|
class Binary
|
121
168
|
## Enhances Binary with verilog generation.
|
122
169
|
|
@@ -1479,7 +1526,16 @@ module HDLRuby::Low
|
|
1479
1526
|
|
1480
1527
|
# Converts the system to Verilog code.
|
1481
1528
|
def to_verilog
|
1482
|
-
return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
|
1529
|
+
# return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
|
1530
|
+
if self.ref.is_a?(RefName) then
|
1531
|
+
return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
|
1532
|
+
else
|
1533
|
+
# No a pure signal, need to use a function for accessing.
|
1534
|
+
at = self.ref.type.to_verilog
|
1535
|
+
rt = self.type.to_verilog
|
1536
|
+
IndexersI.add(at,rt)
|
1537
|
+
return "#{IndexersI.indexer_name(at,rt)}(#{self.ref.to_verilog},#{self.index.to_verilog})"
|
1538
|
+
end
|
1483
1539
|
end
|
1484
1540
|
end
|
1485
1541
|
|
@@ -1505,7 +1561,15 @@ module HDLRuby::Low
|
|
1505
1561
|
|
1506
1562
|
# Converts the system to Verilog code.
|
1507
1563
|
def to_verilog(unknown = false)
|
1508
|
-
|
1564
|
+
if self.ref.is_a?(RefName) then
|
1565
|
+
return "#{self.ref.to_verilog}[#{self.range.first.to_getrange}:#{self.range.last.to_getrange}]"
|
1566
|
+
else
|
1567
|
+
# No a pure signal, need to use a function for accessing.
|
1568
|
+
sr = self.range.first.to_i..self.range.last.to_i
|
1569
|
+
cr = (self.type.width-1)..0
|
1570
|
+
TruncersI.add(cr,sr)
|
1571
|
+
return "#{TruncersI.truncer_name(cr,sr)}(#{self.ref.to_verilog})"
|
1572
|
+
end
|
1509
1573
|
end
|
1510
1574
|
end
|
1511
1575
|
|
@@ -1576,20 +1640,28 @@ module HDLRuby::Low
|
|
1576
1640
|
# end
|
1577
1641
|
# return "#{self.type.range.first + 1}'b#{self.content.to_verilog}"
|
1578
1642
|
if self.content.is_a?(Numeric) then
|
1579
|
-
if self.
|
1580
|
-
|
1581
|
-
|
1582
|
-
|
1583
|
-
|
1643
|
+
if self.type.signed? then
|
1644
|
+
if self.content < 0 then
|
1645
|
+
# str = (2**self.type.width + self.content).to_s(2)
|
1646
|
+
str = self.content.to_s(2)
|
1647
|
+
str = "0" * (self.type.width-str.length+1) + str[1..-1]
|
1648
|
+
return "-#{self.type.width}'sb#{str}"
|
1649
|
+
else
|
1650
|
+
str = self.content.to_s(2)
|
1651
|
+
str = "0" * (self.type.width-str.length) + str
|
1652
|
+
return "#{self.type.width}'sb#{str}"
|
1653
|
+
end
|
1584
1654
|
else
|
1585
|
-
|
1586
|
-
str = "0" * (self.type.width-str.length) + str
|
1587
|
-
return "#{self.type.width}'b#{str}"
|
1655
|
+
return "#{self.type.width}'b#{self.content.to_s(2)}"
|
1588
1656
|
end
|
1589
1657
|
# return "#{self.type.width}'b#{str}"
|
1590
1658
|
else
|
1591
1659
|
str = self.content.to_verilog
|
1592
|
-
|
1660
|
+
if self.content.negative? then
|
1661
|
+
return "#{str.length}'sb#{str}"
|
1662
|
+
else
|
1663
|
+
return "#{str.length}'b#{str}"
|
1664
|
+
end
|
1593
1665
|
end
|
1594
1666
|
end
|
1595
1667
|
# How to use when simply obtaining the width
|
@@ -1770,10 +1842,20 @@ module HDLRuby::Low
|
|
1770
1842
|
cw = self.child.type.width
|
1771
1843
|
sw = self.type.width
|
1772
1844
|
if self.type.signed? then
|
1773
|
-
|
1774
|
-
|
1775
|
-
return "$signed({
|
1776
|
-
|
1845
|
+
# Need to sign extend.
|
1846
|
+
if cw == 1 then
|
1847
|
+
return "$signed({#{sw}{#{self.child.to_verilog}}})"
|
1848
|
+
elsif (sw>cw) then
|
1849
|
+
# return "$signed({{#{sw-cw}{#{self.child.to_verilog}[#{cw-1}]}}," + "#{self.child.to_verilog}})"
|
1850
|
+
if self.child.is_a?(RefName) then
|
1851
|
+
return "$signed({{#{sw-cw}{#{self.child.to_verilog}[#{cw-1}]}}," + "#{self.child.to_verilog}})"
|
1852
|
+
else
|
1853
|
+
# No a pure signal, need to use a function for accessing.
|
1854
|
+
at = self.child.type.to_verilog
|
1855
|
+
rt = bit.to_verilog
|
1856
|
+
IndexersI.add(at,rt)
|
1857
|
+
return "$signed({{#{sw-cw}{#{IndexersI.indexer_name(at,rt)}(#{self.child.to_verilog},#{cw-1})}}," + "#{self.child.to_verilog}})"
|
1858
|
+
end
|
1777
1859
|
elsif (sw<cw) then
|
1778
1860
|
# Need to truncate
|
1779
1861
|
# return "$signed(#{self.child.to_verilog}[#{sw-1}:0])"
|
@@ -2288,6 +2370,8 @@ module HDLRuby::Low
|
|
2288
2370
|
|
2289
2371
|
# Adds the truncing functions.
|
2290
2372
|
code << TruncersI.dump
|
2373
|
+
# Adds the indexing functions.
|
2374
|
+
code << IndexersI.dump
|
2291
2375
|
# Adds the content code.
|
2292
2376
|
code << codeC
|
2293
2377
|
return code
|
@@ -1,42 +1,49 @@
|
|
1
|
-
# Program with inverse conversion
|
2
|
-
# last update 2019 01 29
|
3
|
-
|
4
|
-
module HDLRuby::Verilog
|
5
|
-
|
6
|
-
# This is sample.
|
7
|
-
# n = "abc_ABC_いろは"
|
8
|
-
# puts n
|
9
|
-
# name = n.split("")
|
10
|
-
|
11
|
-
@@hdr2verilog = {}
|
12
|
-
|
13
|
-
# Since it is possible to use $ and numbers other than the beginning of the character string, it is divided.
|
14
|
-
def name_to_verilog(name)
|
15
|
-
# name = name.to_s
|
16
|
-
# # Convert special characters.
|
17
|
-
# name = name.each_char.map do |c|
|
18
|
-
# if c=~ /[a-z0-9]/ then
|
19
|
-
# c
|
20
|
-
# elsif c == "_" then
|
21
|
-
# "__"
|
22
|
-
# else
|
23
|
-
# "_" + c.ord.to_s
|
24
|
-
# end
|
25
|
-
# end.join
|
26
|
-
# # First character: only letter is possible.
|
27
|
-
# unless name[0] =~ /[a-z_]/ then
|
28
|
-
# name = "_" + name
|
29
|
-
# end
|
30
|
-
# return name
|
31
|
-
name = name.to_s
|
32
|
-
vname = @@hdr2verilog[name]
|
33
|
-
unless vname then
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
1
|
+
# Program with inverse conversion
|
2
|
+
# last update 2019 01 29
|
3
|
+
|
4
|
+
module HDLRuby::Verilog
|
5
|
+
|
6
|
+
# This is sample.
|
7
|
+
# n = "abc_ABC_いろは"
|
8
|
+
# puts n
|
9
|
+
# name = n.split("")
|
10
|
+
|
11
|
+
@@hdr2verilog = {}
|
12
|
+
|
13
|
+
# Since it is possible to use $ and numbers other than the beginning of the character string, it is divided.
|
14
|
+
def name_to_verilog(name)
|
15
|
+
# name = name.to_s
|
16
|
+
# # Convert special characters.
|
17
|
+
# name = name.each_char.map do |c|
|
18
|
+
# if c=~ /[a-z0-9]/ then
|
19
|
+
# c
|
20
|
+
# elsif c == "_" then
|
21
|
+
# "__"
|
22
|
+
# else
|
23
|
+
# "_" + c.ord.to_s
|
24
|
+
# end
|
25
|
+
# end.join
|
26
|
+
# # First character: only letter is possible.
|
27
|
+
# unless name[0] =~ /[a-z_]/ then
|
28
|
+
# name = "_" + name
|
29
|
+
# end
|
30
|
+
# return name
|
31
|
+
name = name.to_s
|
32
|
+
vname = @@hdr2verilog[name]
|
33
|
+
unless vname then
|
34
|
+
# Shall we change the string?
|
35
|
+
if name.match?(/^[_a-zA-Z][_a-zA-Z0-9]*$/) then
|
36
|
+
# No, just clone
|
37
|
+
vname = name.clone
|
38
|
+
else
|
39
|
+
# Yes, ensure it is a verilog-compatible name.
|
40
|
+
vname = "_v#{@@hdr2verilog.size}_#{name.split(/[^a-zA-Z_0-9]/)[-1]}"
|
41
|
+
end
|
42
|
+
@@hdr2verilog[name] = vname
|
43
|
+
end
|
44
|
+
return vname
|
45
|
+
end
|
46
|
+
|
47
|
+
#puts ref
|
48
|
+
|
49
|
+
end
|
data/lib/HDLRuby/std/fsm.rb
CHANGED
@@ -219,7 +219,11 @@ module HDLRuby::High::Std
|
|
219
219
|
# The default code.
|
220
220
|
default_codes.each(&:call)
|
221
221
|
# Depending on the state.
|
222
|
-
|
222
|
+
if (type == :sync) then
|
223
|
+
hcase(this.next_state_sig)
|
224
|
+
else
|
225
|
+
hcase(this.cur_state_sig)
|
226
|
+
end
|
223
227
|
states.each do |st|
|
224
228
|
# Register the working state (for the gotos)
|
225
229
|
this.work_state = st
|
@@ -345,6 +349,11 @@ module HDLRuby::High::Std
|
|
345
349
|
|
346
350
|
|
347
351
|
## The interface for building the fsm
|
352
|
+
|
353
|
+
# Gets the current number of states.
|
354
|
+
def size
|
355
|
+
@states.size
|
356
|
+
end
|
348
357
|
|
349
358
|
# Sets the event synchronizing the fsm.
|
350
359
|
def for_event(event = nil,&ruby_block)
|