HDLRuby 2.0.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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HDLRuby.gemspec +36 -0
- data/LICENSE.txt +21 -0
- data/README.md +2774 -0
- data/README.pdf +0 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/hdrcc +3 -0
- data/lib/HDLRuby/alcc.rb +137 -0
- data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
- data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
- data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
- data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
- data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
- data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
- data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
- data/lib/HDLRuby/hdr_samples/include.rb +14 -0
- data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
- data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
- data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
- data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
- data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
- data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
- data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
- data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
- data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
- data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
- data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
- data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
- data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
- data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
- data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
- data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
- data/lib/HDLRuby/hdrcc.rb +623 -0
- data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
- data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
- data/lib/HDLRuby/high_samples/adder.rb +21 -0
- data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
- data/lib/HDLRuby/high_samples/addsub.rb +33 -0
- data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
- data/lib/HDLRuby/high_samples/after.rb +28 -0
- data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
- data/lib/HDLRuby/high_samples/alu.rb +61 -0
- data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
- data/lib/HDLRuby/high_samples/before.rb +28 -0
- data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
- data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
- data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
- data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
- data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
- data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
- data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
- data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
- data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
- data/lib/HDLRuby/high_samples/case.rb +32 -0
- data/lib/HDLRuby/high_samples/case2.rb +30 -0
- data/lib/HDLRuby/high_samples/change.rb +23 -0
- data/lib/HDLRuby/high_samples/clocks.rb +35 -0
- data/lib/HDLRuby/high_samples/comparer.rb +21 -0
- data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
- data/lib/HDLRuby/high_samples/dff.rb +23 -0
- data/lib/HDLRuby/high_samples/each.rb +28 -0
- data/lib/HDLRuby/high_samples/exporter.rb +42 -0
- data/lib/HDLRuby/high_samples/functions.rb +60 -0
- data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
- data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
- data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
- data/lib/HDLRuby/high_samples/instance.rb +37 -0
- data/lib/HDLRuby/high_samples/memory.rb +64 -0
- data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
- data/lib/HDLRuby/high_samples/overload.rb +32 -0
- data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
- data/lib/HDLRuby/high_samples/ram.rb +27 -0
- data/lib/HDLRuby/high_samples/registers.rb +139 -0
- data/lib/HDLRuby/high_samples/rom.rb +23 -0
- data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
- data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
- data/lib/HDLRuby/high_samples/shift.rb +31 -0
- data/lib/HDLRuby/high_samples/shift2.rb +40 -0
- data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
- data/lib/HDLRuby/high_samples/test_all.sh +10 -0
- data/lib/HDLRuby/high_samples/typedef.rb +24 -0
- data/lib/HDLRuby/high_samples/values.rb +70 -0
- data/lib/HDLRuby/high_samples/vector.rb +22 -0
- data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
- data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
- data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
- data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
- data/lib/HDLRuby/hruby_bstr.rb +1085 -0
- data/lib/HDLRuby/hruby_check.rb +317 -0
- data/lib/HDLRuby/hruby_db.rb +432 -0
- data/lib/HDLRuby/hruby_error.rb +44 -0
- data/lib/HDLRuby/hruby_high.rb +4103 -0
- data/lib/HDLRuby/hruby_low.rb +4735 -0
- data/lib/HDLRuby/hruby_low2c.rb +1986 -0
- data/lib/HDLRuby/hruby_low2high.rb +738 -0
- data/lib/HDLRuby/hruby_low2seq.rb +248 -0
- data/lib/HDLRuby/hruby_low2sym.rb +126 -0
- data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
- data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
- data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
- data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
- data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
- data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
- data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
- data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
- data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
- data/lib/HDLRuby/hruby_serializer.rb +398 -0
- data/lib/HDLRuby/hruby_tools.rb +37 -0
- data/lib/HDLRuby/hruby_types.rb +239 -0
- data/lib/HDLRuby/hruby_values.rb +64 -0
- data/lib/HDLRuby/hruby_verilog.rb +1888 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
- data/lib/HDLRuby/low_samples/adder.yaml +97 -0
- data/lib/HDLRuby/low_samples/after.yaml +228 -0
- data/lib/HDLRuby/low_samples/before.yaml +223 -0
- data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
- data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
- data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
- data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
- data/lib/HDLRuby/low_samples/case.yaml +327 -0
- data/lib/HDLRuby/low_samples/change.yaml +135 -0
- data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
- data/lib/HDLRuby/low_samples/cloner.rb +22 -0
- data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
- data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
- data/lib/HDLRuby/low_samples/dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/each.yaml +1328 -0
- data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
- data/lib/HDLRuby/low_samples/functions.yaml +298 -0
- data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
- data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
- data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
- data/lib/HDLRuby/low_samples/memory.yaml +678 -0
- data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
- data/lib/HDLRuby/low_samples/overload.yaml +226 -0
- data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
- data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/ram.yaml +207 -0
- data/lib/HDLRuby/low_samples/registers.yaml +228 -0
- data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
- data/lib/HDLRuby/low_samples/shift.yaml +230 -0
- data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
- data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
- data/lib/HDLRuby/low_samples/test_all.sh +43 -0
- data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
- data/lib/HDLRuby/low_samples/values.yaml +577 -0
- data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/vector.yaml +56 -0
- data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
- data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
- data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
- data/lib/HDLRuby/sim/Makefile +19 -0
- data/lib/HDLRuby/sim/hruby_sim.h +590 -0
- data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
- data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
- data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
- data/lib/HDLRuby/std/channel.rb +354 -0
- data/lib/HDLRuby/std/clocks.rb +165 -0
- data/lib/HDLRuby/std/counters.rb +82 -0
- data/lib/HDLRuby/std/decoder.rb +214 -0
- data/lib/HDLRuby/std/fsm.rb +516 -0
- data/lib/HDLRuby/std/pipeline.rb +220 -0
- data/lib/HDLRuby/std/reconf.rb +309 -0
- data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
- data/lib/HDLRuby/test_hruby_high.rb +594 -0
- data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
- data/lib/HDLRuby/test_hruby_low.rb +934 -0
- data/lib/HDLRuby/v_samples/adder.v +10 -0
- data/lib/HDLRuby/v_samples/dff.v +12 -0
- data/lib/HDLRuby/v_samples/ram.v +20 -0
- data/lib/HDLRuby/v_samples/rom.v +270 -0
- data/lib/HDLRuby/version.rb +3 -0
- data/lib/HDLRuby.rb +11 -0
- data/makedoc +1 -0
- data/metadata.yaml +4 -0
- metadata +299 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Module generating a neuron bias or weight.
|
|
3
|
+
# Params:
|
|
4
|
+
# - +typ+: the data type of the neural signals.
|
|
5
|
+
# - +init_bw+: initial value of the bias/weight.
|
|
6
|
+
system :bw do |typ,init_bw|
|
|
7
|
+
# The control signals.
|
|
8
|
+
input :clk, :reset # Clock and reset
|
|
9
|
+
input :select_initial # Initialization of the bias/weight
|
|
10
|
+
input :select_update # Update of the bias/weight
|
|
11
|
+
|
|
12
|
+
# Update of the bias/weight
|
|
13
|
+
typ.input :dbw
|
|
14
|
+
# Output of the bias/weight
|
|
15
|
+
typ.output :bwo
|
|
16
|
+
|
|
17
|
+
# Behavior controlling the bias/weight
|
|
18
|
+
par(clk.posedge) do
|
|
19
|
+
hif(reset == 1) { bwo <= 0 }
|
|
20
|
+
helsif(select_initial == 1) { bwo <= init_bw }
|
|
21
|
+
helsif(select_update == 1) { bwo <= bwo+dbw }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Module generating the sample counter.
|
|
3
|
+
# Params:
|
|
4
|
+
# - +num+: the number of samples.
|
|
5
|
+
system :counter do |typ,num|
|
|
6
|
+
# The input control signals.
|
|
7
|
+
input :clk, :reset
|
|
8
|
+
# The output counter.
|
|
9
|
+
typ.output :out
|
|
10
|
+
|
|
11
|
+
par(clk.posedge) do
|
|
12
|
+
hif(reset == 1) { out <= 0 }
|
|
13
|
+
helsif(out == num-1) { out <= 0 }
|
|
14
|
+
helse { out <= out+1 }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
require "./counter.rb"
|
|
2
|
+
require "./selector.rb"
|
|
3
|
+
require "./bw.rb"
|
|
4
|
+
require "./z.rb"
|
|
5
|
+
require "./a.rb"
|
|
6
|
+
require "./mem.rb"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Module Generating a foward propagation structure of a NN.
|
|
11
|
+
# Params:
|
|
12
|
+
# - +typ+: the data type for standard computations.
|
|
13
|
+
# - +arch+: the architecture of the NN as a array of columns sizes
|
|
14
|
+
# - +samps+: the NN input and expected outputs samples as a 3D array
|
|
15
|
+
# - +b_init+:the bias initial values as a 2D array
|
|
16
|
+
# - +w_init+:the weights initial values as a 3D array
|
|
17
|
+
# - +actP+: the activation proc, default: ReLU
|
|
18
|
+
# - +sopP+: the sum of production function, default: basic operators
|
|
19
|
+
system :forward do |typ,arch,samps,b_init,w_init,
|
|
20
|
+
actP = proc { |z| mux(z < 0, 0, z) },
|
|
21
|
+
sopP = proc do |xs,ws|
|
|
22
|
+
xs.zip(ws).map{ |x,w| x*w }.reduce(:+)
|
|
23
|
+
end |
|
|
24
|
+
###
|
|
25
|
+
# The interface signals
|
|
26
|
+
|
|
27
|
+
# The control signals
|
|
28
|
+
input :clk, :reset
|
|
29
|
+
input :din, :select_initial
|
|
30
|
+
# The input signals for updating of the weights and biases,
|
|
31
|
+
# and the output signals giving the corresponding current values.
|
|
32
|
+
cap_bs = []
|
|
33
|
+
bs = []
|
|
34
|
+
cap_ws = []
|
|
35
|
+
ws = []
|
|
36
|
+
arch[1..-1].each.with_index do |col,i|
|
|
37
|
+
cap_bs << []
|
|
38
|
+
bs << []
|
|
39
|
+
# The biase update inputs and value outputs
|
|
40
|
+
col.times do |j|
|
|
41
|
+
cap_bs[-1] << ( typ.input :"cap_b#{i+1}_#{j+1}" )
|
|
42
|
+
bs[-1] << ( typ.output :"b#{i+1}_#{j+1}" )
|
|
43
|
+
end
|
|
44
|
+
# The weigh update inputs and value outputs
|
|
45
|
+
cap_ws << []
|
|
46
|
+
ws << []
|
|
47
|
+
col.times do |j0|
|
|
48
|
+
cap_ws[-1] << []
|
|
49
|
+
ws[-1] << []
|
|
50
|
+
arch[i].times do |j1|
|
|
51
|
+
cap_ws[-1][-1] << ( typ.input :"cap_w#{i+1}_#{j0+1}#{j1+1}" )
|
|
52
|
+
ws[-1][-1] << ( typ.output :"w#{i+1}_#{j0+1}#{j1+1}" )
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
# The output signals giving each neuron output.
|
|
57
|
+
as = []
|
|
58
|
+
arch[1..-1].each.with_index do |col,i|
|
|
59
|
+
as << []
|
|
60
|
+
col.times do |j|
|
|
61
|
+
as[-1] << ( typ.output :"a#{i+1}_#{j+1}" )
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
# The output signals indicating the current NN input and expected
|
|
65
|
+
# answer (they are provided by an inner memory).
|
|
66
|
+
ks = []
|
|
67
|
+
arch[0].times do |i|
|
|
68
|
+
# NN input
|
|
69
|
+
ks << ( typ.output :"k#{i+1}" )
|
|
70
|
+
end
|
|
71
|
+
ts = []
|
|
72
|
+
arch[-1].times do |i|
|
|
73
|
+
# NN expected answer
|
|
74
|
+
ts << ( typ.output :"t#{i+1}" )
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
###
|
|
78
|
+
# The inner signals
|
|
79
|
+
|
|
80
|
+
# The control signals
|
|
81
|
+
inner :select_update
|
|
82
|
+
typedef(:outT) { [Math::log2(samps[0][0].size).ceil] } # Sample counter type
|
|
83
|
+
outT.inner :out
|
|
84
|
+
|
|
85
|
+
# The neurons sum results.
|
|
86
|
+
zs = []
|
|
87
|
+
arch[1..-1].each.with_index do |col,i|
|
|
88
|
+
zs << []
|
|
89
|
+
col.times do |j|
|
|
90
|
+
zs[-1] << ( typ.inner :"z#{i+1}_#{j+1}" )
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
###
|
|
95
|
+
# The structural description (instantiation of thre neuron computation
|
|
96
|
+
# systems)
|
|
97
|
+
|
|
98
|
+
# Sample counter
|
|
99
|
+
counter(outT,samps[0][0].size).(:counterI).(clk, reset, out)
|
|
100
|
+
|
|
101
|
+
# Neuron update selector, the skip size is (NN depth)*4+1
|
|
102
|
+
# (4-cycle neurons and one addition sync cycle).
|
|
103
|
+
selector(arch.size*4+1).(:selectorI).(clk, reset, select_update)
|
|
104
|
+
|
|
105
|
+
# Input and expected output memories
|
|
106
|
+
arch[0].times do |i|
|
|
107
|
+
# Samples for input i
|
|
108
|
+
mem(typ,outT,samps[0][i]).(:"k#{i+1}I").(clk, din, out, ks[i])
|
|
109
|
+
end
|
|
110
|
+
arch[-1].times do |i|
|
|
111
|
+
# Expected values for output i
|
|
112
|
+
mem(typ,outT,samps[1][i]).(:"t#{i+1}I").(clk, din, out, ts[i])
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Biases and weights
|
|
116
|
+
arch[1..-1].each.with_index do |col,i|
|
|
117
|
+
# Biases
|
|
118
|
+
col.times do |j|
|
|
119
|
+
bw(typ,b_init[i][j]).
|
|
120
|
+
(:"b#{i+1}_#{j+1}I").(clk, reset, cap_bs[i][j],
|
|
121
|
+
select_initial, select_update, bs[i][j])
|
|
122
|
+
end
|
|
123
|
+
# Weights
|
|
124
|
+
col.times do |j0|
|
|
125
|
+
arch[i].times do |j1|
|
|
126
|
+
bw(typ,w_init[i][j0][j1]).
|
|
127
|
+
(:"w#{i+1}_#{j0+1}#{j1+1}I").(clk,reset,cap_ws[i][j0][j1],
|
|
128
|
+
select_initial, select_update, ws[i][j0][j1])
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Weighted Sums
|
|
134
|
+
# First column
|
|
135
|
+
arch[1].times do |j|
|
|
136
|
+
z(typ,ks.size,sopP).(:"z2_#{j+1}I").
|
|
137
|
+
(clk, reset, *ks, *ws[0][j], bs[0][j], zs[0][j])
|
|
138
|
+
end
|
|
139
|
+
# Other columns
|
|
140
|
+
arch[2..-1].each.with_index do |col,i|
|
|
141
|
+
col.times do |j|
|
|
142
|
+
z(typ,as[i].size,sopP).(:"z#{i+3}_#{j+1}I").
|
|
143
|
+
(clk, reset, *as[i], *ws[i+1][j], bs[i+1][j], zs[i+1][j])
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Activations
|
|
148
|
+
arch[1..-1].each.with_index do |col,i|
|
|
149
|
+
col.times do |j|
|
|
150
|
+
a(typ,actP).(:"a#{i+1}_#{j+1}I").(clk, reset, zs[i][j], as[i][j])
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require "./forward.rb"
|
|
2
|
+
require "./sigmoid.rb"
|
|
3
|
+
|
|
4
|
+
##
|
|
5
|
+
# A fully specified forward module with 8.24-bit fixed point computation
|
|
6
|
+
# and 4.4bit table-based sigmoid activation function.
|
|
7
|
+
# Structure: 2 inputs, one 3-column hidden layer and 2 outputs.
|
|
8
|
+
|
|
9
|
+
system :forward_sub, forward(
|
|
10
|
+
signed[31..0], # Data type
|
|
11
|
+
[2,3,2], # NN structure
|
|
12
|
+
[
|
|
13
|
+
# Input samples.
|
|
14
|
+
# First input.
|
|
15
|
+
[[_sh08000000, _sh08000000, _sh05000000, _sh05000000,
|
|
16
|
+
*([_sh00000000]*28)],
|
|
17
|
+
# Second input.
|
|
18
|
+
[_sh08000000, _sh05000000, _sh08000000, _sh05000000,
|
|
19
|
+
*([_sh00000000]*28)]],
|
|
20
|
+
# Expected outputs
|
|
21
|
+
# First output
|
|
22
|
+
[[_sh01000000, _sh00000000, _sh00000000, _sh00000000,
|
|
23
|
+
*([_sh00000000]*28)],
|
|
24
|
+
# Second output
|
|
25
|
+
[_sh00000000, _sh01000000, _sh01000000, _sh01000000,
|
|
26
|
+
*([_sh00000000]*28)]]
|
|
27
|
+
],
|
|
28
|
+
# Biases initial values
|
|
29
|
+
[
|
|
30
|
+
# Second column
|
|
31
|
+
[_shFF000000, _shFF000000, _shFF000000],
|
|
32
|
+
# Third column
|
|
33
|
+
[_shFF000000, _shFF000000]
|
|
34
|
+
],
|
|
35
|
+
# Weights initial values
|
|
36
|
+
[
|
|
37
|
+
# Second column
|
|
38
|
+
[
|
|
39
|
+
# First neuron
|
|
40
|
+
[ _sh00199999, _sh00666666 ],
|
|
41
|
+
# Second neuron
|
|
42
|
+
[ _sh004CCCCC, _sh00800000 ],
|
|
43
|
+
# Third neuron
|
|
44
|
+
[ _sh00999999, _sh00199999 ]
|
|
45
|
+
],
|
|
46
|
+
# Third column
|
|
47
|
+
[
|
|
48
|
+
# First neuron
|
|
49
|
+
[ _sh00B33333, _sh00333333, _sh0014CCCC ],
|
|
50
|
+
# Second neuron
|
|
51
|
+
[ _sh00333333, _sh00800000, _sh01199999 ]
|
|
52
|
+
]
|
|
53
|
+
],
|
|
54
|
+
# The activation function.
|
|
55
|
+
proc{|addr| sigmoid(8,4,32,24,addr)},
|
|
56
|
+
# The sum of production function.
|
|
57
|
+
proc do |xs,ws|
|
|
58
|
+
(xs.zip(ws).map { |x,w| x*w }.reduce(:+))[27..20]
|
|
59
|
+
end
|
|
60
|
+
) do
|
|
61
|
+
end
|
|
62
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require "./forward.rb"
|
|
2
|
+
require "./sigmoid.rb"
|
|
3
|
+
require "./random.rb"
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
# A fully specified forward module with 8.24-bit fixed point computation
|
|
7
|
+
# and 4.4bit table-based sigmoid activation function.
|
|
8
|
+
# Structure: 2 inputs, one 3-column hidden layer and 2 outputs.
|
|
9
|
+
|
|
10
|
+
system :forward_sub, forward(
|
|
11
|
+
signed[31..0], # Data type
|
|
12
|
+
[2,4,3,2], # NN structure
|
|
13
|
+
[
|
|
14
|
+
# Input samples.
|
|
15
|
+
# First input.
|
|
16
|
+
[[_sh08000000, _sh08000000, _sh05000000, _sh05000000,
|
|
17
|
+
*([_sh00000000]*28)],
|
|
18
|
+
# Second input.
|
|
19
|
+
[_sh08000000, _sh05000000, _sh08000000, _sh05000000,
|
|
20
|
+
*([_sh00000000]*28)]],
|
|
21
|
+
# Expected outputs
|
|
22
|
+
# First output
|
|
23
|
+
[[_sh01000000, _sh00000000, _sh00000000, _sh00000000,
|
|
24
|
+
*([_sh00000000]*28)],
|
|
25
|
+
# Second output
|
|
26
|
+
[_sh00000000, _sh01000000, _sh01000000, _sh01000000,
|
|
27
|
+
*([_sh00000000]*28)]]
|
|
28
|
+
],
|
|
29
|
+
# Biases initial values
|
|
30
|
+
rand_array([4,3,2],32),
|
|
31
|
+
# Weights initial values
|
|
32
|
+
rand_array([[2,2,2,2],[4,4,4],[3,3]],32),
|
|
33
|
+
# The activation function.
|
|
34
|
+
proc{|addr| sigmoid(8,4,32,24,addr)},
|
|
35
|
+
# The sum of production function.
|
|
36
|
+
proc do |xs,ws|
|
|
37
|
+
(xs.zip(ws).map { |x,w| x*w }.reduce(:+))[27..20]
|
|
38
|
+
end
|
|
39
|
+
) do
|
|
40
|
+
end
|
|
41
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require "./forward.rb"
|
|
2
|
+
require "./sigmoid.rb"
|
|
3
|
+
require "./random.rb"
|
|
4
|
+
|
|
5
|
+
# proc do |xs,ws|
|
|
6
|
+
# (xs.zip(ws).map { |x,w| x*w }.reduce(:+))[27..20]
|
|
7
|
+
# end
|
|
8
|
+
|
|
9
|
+
# 16:16 Fixed-point type.
|
|
10
|
+
[31..0].signed.typedef(:fix32)
|
|
11
|
+
# Multiply must adjust point.
|
|
12
|
+
fix32.define_operator(:*) do |left,right|
|
|
13
|
+
( left.as([31..0]) * right ) >> 32
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# A fully specified forward module with 8.24-bit fixed point computation
|
|
19
|
+
# and 4.4bit table-based sigmoid activation function.
|
|
20
|
+
# Structure: 2 inputs, one 3-column hidden layer and 2 outputs.
|
|
21
|
+
|
|
22
|
+
system :forward_sub, forward(
|
|
23
|
+
fix32, # Data type
|
|
24
|
+
[2,4,3,2], # NN structure
|
|
25
|
+
[
|
|
26
|
+
# Input samples.
|
|
27
|
+
# First input.
|
|
28
|
+
[[_sh08000000, _sh08000000, _sh05000000, _sh05000000,
|
|
29
|
+
*([_sh00000000]*28)],
|
|
30
|
+
# Second input.
|
|
31
|
+
[_sh08000000, _sh05000000, _sh08000000, _sh05000000,
|
|
32
|
+
*([_sh00000000]*28)]],
|
|
33
|
+
# Expected outputs
|
|
34
|
+
# First output
|
|
35
|
+
[[_sh01000000, _sh00000000, _sh00000000, _sh00000000,
|
|
36
|
+
*([_sh00000000]*28)],
|
|
37
|
+
# Second output
|
|
38
|
+
[_sh00000000, _sh01000000, _sh01000000, _sh01000000,
|
|
39
|
+
*([_sh00000000]*28)]]
|
|
40
|
+
],
|
|
41
|
+
# Biases initial values
|
|
42
|
+
rand_array([4,3,2],32),
|
|
43
|
+
# Weights initial values
|
|
44
|
+
rand_array([[2,2,2,2],[4,4,4],[3,3]],32)
|
|
45
|
+
) do
|
|
46
|
+
end
|
|
47
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Module generating a lookup table memory.
|
|
3
|
+
# Params:
|
|
4
|
+
# - +inT+: the data type of the input (address).
|
|
5
|
+
# - +outT+: the data type of the output (data).
|
|
6
|
+
# - +ar+: the contents of the memory as an array.
|
|
7
|
+
system :mem do |inT,outT,ar|
|
|
8
|
+
# The control signals.
|
|
9
|
+
input :clk # Clock
|
|
10
|
+
input :din # Read enable
|
|
11
|
+
|
|
12
|
+
# The interface signals.
|
|
13
|
+
inT.input :addr # Address
|
|
14
|
+
outT.output :data # Data
|
|
15
|
+
|
|
16
|
+
# The memory.
|
|
17
|
+
outT[ar.size].inner :contents
|
|
18
|
+
|
|
19
|
+
# Fills the memory (static)
|
|
20
|
+
# ar.each.with_index do |val,i|
|
|
21
|
+
# contents[i] <= val
|
|
22
|
+
# end
|
|
23
|
+
contents <= ar
|
|
24
|
+
|
|
25
|
+
# Handle the access to the memory.
|
|
26
|
+
par(clk.posedge) do
|
|
27
|
+
hif(din == 1) { data <= contents[addr] }
|
|
28
|
+
helse { data <= :"_#{"z"*outT.width}" }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Generate a +width+ bit (signed) random value.
|
|
2
|
+
def rand_signed(width)
|
|
3
|
+
:"_s#{width.times.map { Random.rand(0..1).to_s }.join }".to_expr
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
# Generates a N-dimension array described by +geometry+ filled
|
|
7
|
+
# with +width+ bit values.
|
|
8
|
+
def rand_array(geometry,width)
|
|
9
|
+
if geometry.is_a?(Array) then
|
|
10
|
+
# Geometry is hierarchical, recurse on it.
|
|
11
|
+
return geometry.map {|elem| rand_array(elem,width) }
|
|
12
|
+
else
|
|
13
|
+
# Geometry is a size of a 1-D array, generate it.
|
|
14
|
+
return geometry.times.map { |i| rand_signed(width) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# rand_array(4,6).each do |v|
|
|
19
|
+
# puts v.content
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# system :test do
|
|
23
|
+
# end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Module generating the selector that decides if a neuron is to update or not.
|
|
3
|
+
# Params:
|
|
4
|
+
# - +skip+: the number of clocks to skip.
|
|
5
|
+
system :selector do |skip|
|
|
6
|
+
input :clk, :reset
|
|
7
|
+
output :enable_update
|
|
8
|
+
|
|
9
|
+
# The clock counter.
|
|
10
|
+
[Math::log2(skip).ceil].inner :counter
|
|
11
|
+
|
|
12
|
+
# The behavior handling the skip counter
|
|
13
|
+
par(clk.posedge) do
|
|
14
|
+
hif(reset == 1) { counter <= 0 }
|
|
15
|
+
helse do
|
|
16
|
+
hif(counter == skip-1) { counter <=0 }
|
|
17
|
+
helse {counter <= counter + 1 }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# The behavior handling the update signal
|
|
22
|
+
par(clk.posedge) do
|
|
23
|
+
hif(reset == 1) { enable_update <= 0 }
|
|
24
|
+
helse do
|
|
25
|
+
hif(counter == skip-1) { enable_update <= 1 }
|
|
26
|
+
helse { enable_update <= 0 }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
def sigmoid(a_width, a_point, d_width, d_point, addr)
|
|
2
|
+
# Initialize the result to force it as a ruby variable.
|
|
3
|
+
High.cur_system.open do
|
|
4
|
+
sub do
|
|
5
|
+
# Generates the rom
|
|
6
|
+
[d_width][2**a_width].inner :contents
|
|
7
|
+
contents <= (2**a_width).times.map do |i|
|
|
8
|
+
# Converts i to a float
|
|
9
|
+
i = i.to_f * 2**(-a_point)
|
|
10
|
+
# Compute the sigmoid
|
|
11
|
+
sigm = (1.0 / (1+Math.exp(i)))
|
|
12
|
+
# Convert it to fixed point
|
|
13
|
+
(sigm * 2**d_point).to_i
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Use it for the access
|
|
17
|
+
contents[addr[(a_point+d_width-1-d_point)..a_point-d_point]]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
##
|
|
2
|
+
# Module generating a neuron sum.
|
|
3
|
+
# Params:
|
|
4
|
+
# - +typ+: the data type of the neural signals.
|
|
5
|
+
# - +ary+: the arity of the neuron.
|
|
6
|
+
# - +sopP+: the sum of product function.
|
|
7
|
+
system :z do |typ,ary,sopP|
|
|
8
|
+
# The control signals.
|
|
9
|
+
input :clk, :reset # Clock and reset
|
|
10
|
+
|
|
11
|
+
# The inputs of the neuron.
|
|
12
|
+
ins = []
|
|
13
|
+
wgs = []
|
|
14
|
+
ary.times do |i|
|
|
15
|
+
# The input values
|
|
16
|
+
ins << typ.input(:"x#{i}")
|
|
17
|
+
end
|
|
18
|
+
ary.times do |i|
|
|
19
|
+
# The weights
|
|
20
|
+
wgs << typ.input(:"w#{i}")
|
|
21
|
+
end
|
|
22
|
+
# The bias
|
|
23
|
+
typ.input :bias
|
|
24
|
+
|
|
25
|
+
# The sum output
|
|
26
|
+
typ.output :z
|
|
27
|
+
|
|
28
|
+
# Behavior controlling the bias/weight
|
|
29
|
+
par(clk.posedge) do
|
|
30
|
+
hif(reset == 1) { z <= 0 }
|
|
31
|
+
helse { z <= sopP.(ins + [1],wgs + [bias]) }
|
|
32
|
+
end
|
|
33
|
+
end
|