HDLRuby 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +4 -0
  6. data/HDLRuby.gemspec +36 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +2774 -0
  9. data/README.pdf +0 -0
  10. data/Rakefile +10 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/exe/hdrcc +3 -0
  14. data/lib/HDLRuby/alcc.rb +137 -0
  15. data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
  16. data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
  17. data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
  18. data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
  19. data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
  20. data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
  21. data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
  22. data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
  23. data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
  24. data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
  25. data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
  26. data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
  27. data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
  28. data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
  29. data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
  30. data/lib/HDLRuby/hdr_samples/include.rb +14 -0
  31. data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
  32. data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
  33. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
  34. data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
  35. data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
  36. data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
  37. data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
  38. data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
  39. data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
  40. data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
  41. data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
  42. data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
  43. data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
  44. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
  45. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
  46. data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
  47. data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
  48. data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
  49. data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
  50. data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
  51. data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
  52. data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
  53. data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
  54. data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
  55. data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
  56. data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
  57. data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
  58. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
  59. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
  60. data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
  61. data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
  62. data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
  63. data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
  64. data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
  65. data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
  66. data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
  67. data/lib/HDLRuby/hdrcc.rb +623 -0
  68. data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
  69. data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
  70. data/lib/HDLRuby/high_samples/adder.rb +21 -0
  71. data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
  72. data/lib/HDLRuby/high_samples/addsub.rb +33 -0
  73. data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
  74. data/lib/HDLRuby/high_samples/after.rb +28 -0
  75. data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
  76. data/lib/HDLRuby/high_samples/alu.rb +61 -0
  77. data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
  78. data/lib/HDLRuby/high_samples/before.rb +28 -0
  79. data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
  80. data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
  81. data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
  82. data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
  83. data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
  84. data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
  85. data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
  86. data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
  87. data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
  88. data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
  89. data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
  90. data/lib/HDLRuby/high_samples/case.rb +32 -0
  91. data/lib/HDLRuby/high_samples/case2.rb +30 -0
  92. data/lib/HDLRuby/high_samples/change.rb +23 -0
  93. data/lib/HDLRuby/high_samples/clocks.rb +35 -0
  94. data/lib/HDLRuby/high_samples/comparer.rb +21 -0
  95. data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
  96. data/lib/HDLRuby/high_samples/dff.rb +23 -0
  97. data/lib/HDLRuby/high_samples/each.rb +28 -0
  98. data/lib/HDLRuby/high_samples/exporter.rb +42 -0
  99. data/lib/HDLRuby/high_samples/functions.rb +60 -0
  100. data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
  101. data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
  102. data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
  103. data/lib/HDLRuby/high_samples/instance.rb +37 -0
  104. data/lib/HDLRuby/high_samples/memory.rb +64 -0
  105. data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
  106. data/lib/HDLRuby/high_samples/overload.rb +32 -0
  107. data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
  108. data/lib/HDLRuby/high_samples/ram.rb +27 -0
  109. data/lib/HDLRuby/high_samples/registers.rb +139 -0
  110. data/lib/HDLRuby/high_samples/rom.rb +23 -0
  111. data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
  112. data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
  113. data/lib/HDLRuby/high_samples/shift.rb +31 -0
  114. data/lib/HDLRuby/high_samples/shift2.rb +40 -0
  115. data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
  116. data/lib/HDLRuby/high_samples/test_all.sh +10 -0
  117. data/lib/HDLRuby/high_samples/typedef.rb +24 -0
  118. data/lib/HDLRuby/high_samples/values.rb +70 -0
  119. data/lib/HDLRuby/high_samples/vector.rb +22 -0
  120. data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
  121. data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
  122. data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
  123. data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
  124. data/lib/HDLRuby/hruby_bstr.rb +1085 -0
  125. data/lib/HDLRuby/hruby_check.rb +317 -0
  126. data/lib/HDLRuby/hruby_db.rb +432 -0
  127. data/lib/HDLRuby/hruby_error.rb +44 -0
  128. data/lib/HDLRuby/hruby_high.rb +4103 -0
  129. data/lib/HDLRuby/hruby_low.rb +4735 -0
  130. data/lib/HDLRuby/hruby_low2c.rb +1986 -0
  131. data/lib/HDLRuby/hruby_low2high.rb +738 -0
  132. data/lib/HDLRuby/hruby_low2seq.rb +248 -0
  133. data/lib/HDLRuby/hruby_low2sym.rb +126 -0
  134. data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
  135. data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
  136. data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
  137. data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
  138. data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
  139. data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
  140. data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
  141. data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
  142. data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
  143. data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
  144. data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
  145. data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
  146. data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
  147. data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
  148. data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
  149. data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
  150. data/lib/HDLRuby/hruby_serializer.rb +398 -0
  151. data/lib/HDLRuby/hruby_tools.rb +37 -0
  152. data/lib/HDLRuby/hruby_types.rb +239 -0
  153. data/lib/HDLRuby/hruby_values.rb +64 -0
  154. data/lib/HDLRuby/hruby_verilog.rb +1888 -0
  155. data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
  156. data/lib/HDLRuby/low_samples/adder.yaml +97 -0
  157. data/lib/HDLRuby/low_samples/after.yaml +228 -0
  158. data/lib/HDLRuby/low_samples/before.yaml +223 -0
  159. data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
  160. data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
  161. data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
  162. data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
  163. data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
  164. data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
  165. data/lib/HDLRuby/low_samples/case.yaml +327 -0
  166. data/lib/HDLRuby/low_samples/change.yaml +135 -0
  167. data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
  168. data/lib/HDLRuby/low_samples/cloner.rb +22 -0
  169. data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
  170. data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
  171. data/lib/HDLRuby/low_samples/dff.yaml +107 -0
  172. data/lib/HDLRuby/low_samples/each.yaml +1328 -0
  173. data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
  174. data/lib/HDLRuby/low_samples/functions.yaml +298 -0
  175. data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
  176. data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
  177. data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
  178. data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
  179. data/lib/HDLRuby/low_samples/memory.yaml +678 -0
  180. data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
  181. data/lib/HDLRuby/low_samples/overload.yaml +226 -0
  182. data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
  183. data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
  184. data/lib/HDLRuby/low_samples/ram.yaml +207 -0
  185. data/lib/HDLRuby/low_samples/registers.yaml +228 -0
  186. data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
  187. data/lib/HDLRuby/low_samples/shift.yaml +230 -0
  188. data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
  189. data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
  190. data/lib/HDLRuby/low_samples/test_all.sh +43 -0
  191. data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
  192. data/lib/HDLRuby/low_samples/values.yaml +577 -0
  193. data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
  194. data/lib/HDLRuby/low_samples/vector.yaml +56 -0
  195. data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
  196. data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
  197. data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
  198. data/lib/HDLRuby/sim/Makefile +19 -0
  199. data/lib/HDLRuby/sim/hruby_sim.h +590 -0
  200. data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
  201. data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
  202. data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
  203. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
  204. data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
  205. data/lib/HDLRuby/std/channel.rb +354 -0
  206. data/lib/HDLRuby/std/clocks.rb +165 -0
  207. data/lib/HDLRuby/std/counters.rb +82 -0
  208. data/lib/HDLRuby/std/decoder.rb +214 -0
  209. data/lib/HDLRuby/std/fsm.rb +516 -0
  210. data/lib/HDLRuby/std/pipeline.rb +220 -0
  211. data/lib/HDLRuby/std/reconf.rb +309 -0
  212. data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
  213. data/lib/HDLRuby/test_hruby_high.rb +594 -0
  214. data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
  215. data/lib/HDLRuby/test_hruby_low.rb +934 -0
  216. data/lib/HDLRuby/v_samples/adder.v +10 -0
  217. data/lib/HDLRuby/v_samples/dff.v +12 -0
  218. data/lib/HDLRuby/v_samples/ram.v +20 -0
  219. data/lib/HDLRuby/v_samples/rom.v +270 -0
  220. data/lib/HDLRuby/version.rb +3 -0
  221. data/lib/HDLRuby.rb +11 -0
  222. data/makedoc +1 -0
  223. data/metadata.yaml +4 -0
  224. metadata +299 -0
@@ -0,0 +1,261 @@
1
+ require 'HDLRuby/backend/allocator'
2
+ require 'HDLRuby/hdr_samples/mei8'
3
+
4
+ ## A generic CPU description
5
+ class CPU
6
+
7
+ ## Allocator assotiated with the bus of the CPU
8
+ attr_reader :allocator
9
+
10
+ ## The clock.
11
+ attr_reader :clk
12
+ ## The reset.
13
+ attr_reader :rst
14
+
15
+ ## The address bus
16
+ attr_reader :abus
17
+ ## The data bus
18
+ attr_reader :dbus
19
+ ## The read/!write selection
20
+ attr_reader :rwb
21
+ ## The request
22
+ attr_reader :req
23
+ ## The acknowledge
24
+ attr_reader :ack
25
+
26
+ ## Creates a new generic CPU whose data bus is +dwidth+ bit wide,
27
+ # address bus is +awidth+ bit wide, clock is +clk+, reset +rst+.
28
+ def initialize(dwidth,awidth,clk,rst)
29
+ # Check and set the word and address bus widths
30
+ awidth = awidth.to_i
31
+ dwidth = dwidth.to_i
32
+ @awidth = awidth
33
+ @dwidth = dwidth
34
+ # Check and set the signals.
35
+ @clk = clk.to_ref
36
+ @rst = rst.to_ref
37
+ # The allocator of the CPU
38
+ @allocator = Allocator.new(0..(2**@addr),@data)
39
+
40
+ # Declare the address and data buses and the
41
+ # rwb/req/ack control signals
42
+ abus,dbus = nil,nil
43
+ rwb,req,ack = nil,nil,nil
44
+ # Declares the data and address bus.
45
+ HDLRuby::High.cur_system.open do
46
+ abus = [awidth].input(HDLRuby.uniq_name)
47
+ dbus = [dwidth].input(HDLRuby.uniq_name)
48
+ rwb = input(HDLRuby.uniq_name)
49
+ req = input(HDLRuby.uniq_name)
50
+ ack = output(HDLRuby.uniq_name)
51
+ end
52
+ @abus,@dbus = abus,dbus
53
+ @rwb,@req,@ack = rwb,req,ack
54
+ end
55
+
56
+ ## Connect signal +sig+ to the bus allocating an address to access it.
57
+ def connect(sig)
58
+ # Allocates the signal in the address space.
59
+ @allocator.allocate(sig)
60
+ end
61
+
62
+ ## Generates the bus controller.
63
+ def controller
64
+ clk,rst,req,ack = @clk,@rst,@req,@ack
65
+ abus,dbus,rwb = @abus,@dbus,@rwb
66
+ allocator = @allocator
67
+ HDLRuby::High.cur_system.open do
68
+ par(clk) do
69
+ # Bus controller
70
+ hcase(abus)
71
+ hif(req) do
72
+ ack <= 1
73
+ allocator.each do |sig,addr|
74
+ hwhen(addr) do
75
+ hif(rwb) { dbus <= sig }
76
+ helse { sig <= dbus }
77
+ end
78
+ end
79
+ end
80
+ helse do
81
+ ack <= 0
82
+ end
83
+ end
84
+ end
85
+
86
+ ## Generates a read of sig executing +ruby_block+ on the result.
87
+ def read(sig,&ruby_block)
88
+ addr = @allocator.get(sig)
89
+ hif(ack == 0) do
90
+ @abus <= addr
91
+ @rwb <= 1
92
+ @req <= 1
93
+ helse
94
+ @req <= 0
95
+ ruby_block.call(@dbus)
96
+ end
97
+ end
98
+
99
+ ## Generates a write +val+ to +sig+ executing +ruby_block+
100
+ # in case of success.
101
+ def write(val,sig,&ruby_block)
102
+ addr = @allocator.get(sig)
103
+ hif(ack == 0) do
104
+ @abus <= addr
105
+ @dbus <= val
106
+ @rwb <= 0
107
+ @req <= 1
108
+ helse
109
+ @req <= 0
110
+ ruby_block.call
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+
117
+ # Simulates an 8-bit data 8-bit address CPU
118
+ class MEI8 < CPU
119
+
120
+
121
+ ## Creates a new CPU simulator.
122
+ def initialize(clk,rst)
123
+ super(8,8,clk,rst)
124
+
125
+ # Instantiate the mei processor.
126
+
127
+ mei8(:my_mei8).(self.clk,self.rst,
128
+ self.req,self.rwb,
129
+ self.abus,self.dbus,
130
+ self.ack,
131
+ 0,0)
132
+ end
133
+
134
+
135
+
136
+
137
+ ## Generates a read of signal +sig+.
138
+ def read(code,sig)
139
+ # Generate the resulting SW access.
140
+ return "*(0x#{self.allocator.get(sig).to_s(16)})"
141
+ end
142
+
143
+ ## Generates a write of +val+ to signal +sig+.
144
+ def write(val,sig)
145
+ # Generate the resulting SW access.
146
+ return "*(0x#{self.allocator.get(sig).to_s(16)}) = #{val};\n"
147
+ end
148
+ end
149
+
150
+
151
+
152
+
153
+
154
+
155
+ # An 8-bit register with C encrypting.
156
+ system :encrypt_register do |cpu|
157
+ input :clk, :rst
158
+ [8].input :d
159
+ [8].output :q
160
+
161
+ my_cpy = cpu.new(clk,rst)
162
+
163
+ my_cpu.connect(d)
164
+ my_cpu.connect(q)
165
+ my_cpu.controller
166
+
167
+ code clk.posedge, c: [ "
168
+ #include <stdio.h>
169
+ #include \"hruby_sim.h\"
170
+ #include \"hruby_sim_gen.h\"
171
+
172
+ void encrypt() {
173
+ static char keys[] = { 'S', 'e', 'c', 'r', 'e', 't', ' ', '!' };
174
+ static int index = 0;
175
+ char buf;
176
+ buf = ",my_cpu.read(d),";
177
+ printf(\"######################## From software: encrypting d=%x\\n\",buf);
178
+ buf = buf ^ (keys[index]);
179
+ index = (index + 1) & (sizeof(keys)-1);
180
+ printf(\"######################## From software: result =%x\\n\",buf);
181
+ ",my_cpu.write("buf",q),";
182
+
183
+ }
184
+ " ],
185
+ sim: "encrypt"
186
+ end
187
+
188
+ # A benchmark for the register.
189
+ system :encrypt_bench do
190
+ [8].inner :d, :clk, :rst
191
+ [8].inner :q
192
+
193
+ encrypt_register(:my_register).(clk,rst,d,q)
194
+
195
+ timed do
196
+ clk <= 0
197
+ rst <= 0
198
+ d <= 0
199
+ !10.ns
200
+ clk <= 1
201
+ rst <= 0
202
+ d <= 0
203
+ !10.ns
204
+ clk <= 0
205
+ rst <= 1
206
+ d <= 0
207
+ !10.ns
208
+ clk <= 1
209
+ rst <= 1
210
+ d <= 0
211
+ !10.ns
212
+ clk <= 0
213
+ rst <= 0
214
+ d <= 1
215
+ !10.ns
216
+ clk <= 1
217
+ rst <= 0
218
+ d <= 1
219
+ !10.ns
220
+ clk <= 0
221
+ rst <= 0
222
+ d <= 2
223
+ !10.ns
224
+ clk <= 1
225
+ rst <= 0
226
+ d <= 2
227
+ !10.ns
228
+ clk <= 0
229
+ rst <= 0
230
+ d <= 0
231
+ !10.ns
232
+ clk <= 1
233
+ rst <= 0
234
+ d <= 255
235
+ !10.ns
236
+ clk <= 0
237
+ rst <= 0
238
+ d <= 255
239
+ !10.ns
240
+ clk <= 1
241
+ rst <= 0
242
+ d <= 255
243
+ !10.ns
244
+ clk <= 0
245
+ rst <= 0
246
+ d <= 0
247
+ !10.ns
248
+ clk <= 1
249
+ rst <= 0
250
+ d <= 0
251
+ !10.ns
252
+ clk <= 0
253
+ rst <= 0
254
+ d <= 0
255
+ !10.ns
256
+ clk <= 1
257
+ rst <= 0
258
+ d <= 0
259
+ !10.ns
260
+ end
261
+ end
@@ -0,0 +1,302 @@
1
+ require 'HDLRuby/backend/allocator'
2
+
3
+ ## A generic CPU description
4
+ class CPU
5
+
6
+ ## Allocator assotiated with the bus of the CPU
7
+ attr_reader :allocator
8
+
9
+ ## The clock.
10
+ attr_reader :clk
11
+ ## The reset.
12
+ attr_reader :rst
13
+
14
+ ## The address bus
15
+ attr_reader :abus
16
+ ## The data bus
17
+ attr_reader :dbus
18
+ ## The read/!write selection
19
+ attr_reader :rwb
20
+ ## The request
21
+ attr_reader :req
22
+ ## The acknowledge
23
+ attr_reader :ack
24
+
25
+ ## Creates a new generic CPU whose data bus is +dwidth+ bit wide,
26
+ # address bus is +awidth+ bit wide, clock is +clk+, reset +rst+.
27
+ def initialize(dwidth,awidth,clk,rst)
28
+ # Check and set the word and address bus widths
29
+ awidth = awidth.to_i
30
+ dwidth = dwidth.to_i
31
+ @awidth = awidth
32
+ @dwidth = dwidth
33
+ # Check and set the signals.
34
+ @clk = clk.to_ref
35
+ @rst = rst.to_ref
36
+ # The allocator of the CPU
37
+ @allocator = Allocator.new(0..(2**@addr),@data)
38
+
39
+ # Declare the address and data buses and the
40
+ # rwb/req/ack control signals
41
+ abus,dbus = nil,nil
42
+ rwb,req,ack = nil,nil,nil
43
+ # Declares the data and address bus.
44
+ HDLRuby::High.cur_system.open do
45
+ abus = [awidth].input(HDLRuby.uniq_name)
46
+ dbus = [dwidth].input(HDLRuby.uniq_name)
47
+ rwb = input(HDLRuby.uniq_name)
48
+ req = input(HDLRuby.uniq_name)
49
+ ack = output(HDLRuby.uniq_name)
50
+ end
51
+ @abus,@dbus = abus,dbus
52
+ @rwb,@req,@ack = rwb,req,ack
53
+ end
54
+
55
+ ## Connect signal +sig+ to the bus allocating an address to access it.
56
+ def connect(sig)
57
+ # Allocates the signal in the address space.
58
+ @allocator.allocate(sig)
59
+ end
60
+
61
+ ## Generates the bus controller.
62
+ def controller
63
+ clk,rst,req,ack = @clk,@rst,@req,@ack
64
+ abus,dbus,rwb = @abus,@dbus,@rwb
65
+ allocator = @allocator
66
+ HDLRuby::High.cur_system.open do
67
+ par(clk) do
68
+ # Bus controller
69
+ hcase(abus)
70
+ hif(req) do
71
+ ack <= 1
72
+ allocator.each do |sig,addr|
73
+ hwhen(addr) do
74
+ hif(rwb) { dbus <= sig }
75
+ helse { sig <= dbus }
76
+ end
77
+ end
78
+ end
79
+ helse do
80
+ ack <= 0
81
+ end
82
+ end
83
+ end
84
+
85
+ ## Generates a read of sig executing +ruby_block+ on the result.
86
+ def read(sig,&ruby_block)
87
+ addr = @allocator.get(sig)
88
+ hif(ack == 0) do
89
+ @abus <= addr
90
+ @rwb <= 1
91
+ @req <= 1
92
+ helse
93
+ @req <= 0
94
+ ruby_block.call(@dbus)
95
+ end
96
+ end
97
+
98
+ ## Generates a write +val+ to +sig+ executing +ruby_block+
99
+ # in case of success.
100
+ def write(val,sig,&ruby_block)
101
+ addr = @allocator.get(sig)
102
+ hif(ack == 0) do
103
+ @abus <= addr
104
+ @dbus <= val
105
+ @rwb <= 0
106
+ @req <= 1
107
+ helse
108
+ @req <= 0
109
+ ruby_block.call
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+
116
+ # Simulates an 8-bit data 8-bit address CPU
117
+ class CPUSimu < CPU
118
+ # Read and write are overwritten, save them before.
119
+ alias_method :hw_read, :read
120
+ alias_method :hw_write, :write
121
+
122
+
123
+ ## Creates a new CPU simulator.
124
+ def initialize(clk,rst)
125
+ super(8,8,clk,rst)
126
+
127
+ # The read and write control signals.
128
+ @read_action = inner(HDLRuby.uniq_name)
129
+ @write_action = inner(HDLRuby.uniq_name)
130
+ @value = [8].inner(HDLRuby.uniq_name)
131
+
132
+ # The CPU simulator code.
133
+ this = self
134
+ read_action,write_action = @read_action, @write_action
135
+ value = @value
136
+ par(this.posedge) do
137
+ hif(this.rst) do
138
+ read_action <= 0
139
+ write_action <= 0
140
+ end
141
+ helse do
142
+ hif(read_action) do
143
+ this.hw_read(this.target,value) do
144
+ read_action <= 0
145
+ end
146
+ end
147
+ helsif(write_action) do
148
+ this.hw_write(this.target,write_value) do
149
+ write_action <= 0
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ # The runtime code.
156
+ code c: [
157
+ "unsigned char mem_read(unsigned char addr) {
158
+ unsigned char res;
159
+ write8(1,",@read_action,");
160
+ wait_cond8(0,",@read_action,");
161
+ return read8(",@value,");
162
+ }
163
+
164
+ void mem_write(unsigned char val, unsigned char addr) {
165
+ unsigned char res;
166
+ write8(1,",@write_action,");
167
+ write8(val,",@value,");
168
+ wait_cond8(0,",@write_action,");
169
+ }
170
+ "], h:
171
+ "extern unsigned char mem_read(unsigned char addr);
172
+ extern void mem_write(unsigned char val, unsigned char addr);
173
+ "
174
+ end
175
+
176
+
177
+
178
+ ## Generates a read of signal +sig+.
179
+ def read(code,sig)
180
+ # Generate the resulting SW access.
181
+ return ["mem_read(",code,"0x#{self.allocator.get(sig).to_s(16)})"]
182
+ end
183
+
184
+ ## Generates a write of +val+ to signal +sig+.
185
+ def write(val,sig)
186
+ # Generate the resulting SW access.
187
+ return ["mem_write(,",code,",#{val},#{self.allocator.get(sig).to_s(16)})"]
188
+ end
189
+ end
190
+
191
+
192
+
193
+
194
+
195
+
196
+ # An 8-bit register with C encrypting.
197
+ system :encrypt_register do |cpu|
198
+ input :clk, :rst
199
+ [8].input :d
200
+ [8].output :q
201
+
202
+ my_cpy = cpu.new(clk,rst)
203
+
204
+ my_cpu.connect(d)
205
+ my_cpu.connect(q)
206
+ my_cpu.controller
207
+
208
+ code clk.posedge, c: [ "
209
+ #include <stdio.h>
210
+ #include \"hruby_sim.h\"
211
+ #include \"hruby_sim_gen.h\"
212
+
213
+ void encrypt() {
214
+ static char keys[] = { 'S', 'e', 'c', 'r', 'e', 't', ' ', '!' };
215
+ static int index = 0;
216
+ char buf;
217
+ buf = ",my_cpu.read(self,d),";
218
+ printf(\"######################## From software: encrypting d=%x\\n\",buf);
219
+ buf = buf ^ (keys[index]);
220
+ index = (index + 1) & sizeof(keys)-1;
221
+ printf(\"######################## From software: result =%x\\n\",buf);
222
+ ",my_cpu.write(self,"buf",q),";
223
+
224
+ }
225
+ " ],
226
+ sim: "encrypt"
227
+ end
228
+
229
+ # A benchmark for the register.
230
+ system :encrypt_bench do
231
+ [8].inner :d, :clk, :rst
232
+ [8].inner :q
233
+
234
+ encrypt_register(:my_register).(clk,rst,d,q)
235
+
236
+ timed do
237
+ clk <= 0
238
+ rst <= 0
239
+ d <= 0
240
+ !10.ns
241
+ clk <= 1
242
+ rst <= 0
243
+ d <= 0
244
+ !10.ns
245
+ clk <= 0
246
+ rst <= 1
247
+ d <= 0
248
+ !10.ns
249
+ clk <= 1
250
+ rst <= 1
251
+ d <= 0
252
+ !10.ns
253
+ clk <= 0
254
+ rst <= 0
255
+ d <= 1
256
+ !10.ns
257
+ clk <= 1
258
+ rst <= 0
259
+ d <= 1
260
+ !10.ns
261
+ clk <= 0
262
+ rst <= 0
263
+ d <= 2
264
+ !10.ns
265
+ clk <= 1
266
+ rst <= 0
267
+ d <= 2
268
+ !10.ns
269
+ clk <= 0
270
+ rst <= 0
271
+ d <= 0
272
+ !10.ns
273
+ clk <= 1
274
+ rst <= 0
275
+ d <= 255
276
+ !10.ns
277
+ clk <= 0
278
+ rst <= 0
279
+ d <= 255
280
+ !10.ns
281
+ clk <= 1
282
+ rst <= 0
283
+ d <= 255
284
+ !10.ns
285
+ clk <= 0
286
+ rst <= 0
287
+ d <= 0
288
+ !10.ns
289
+ clk <= 1
290
+ rst <= 0
291
+ d <= 0
292
+ !10.ns
293
+ clk <= 0
294
+ rst <= 0
295
+ d <= 0
296
+ !10.ns
297
+ clk <= 1
298
+ rst <= 0
299
+ d <= 0
300
+ !10.ns
301
+ end
302
+ end
@@ -0,0 +1,11 @@
1
+ system :dff do
2
+ input :clk, :rst, :d
3
+ output :q
4
+
5
+ (q <= d & ~rst).at(clk.posedge)
6
+ end
7
+
8
+ dff.open do
9
+ output :qb
10
+ qb <= ~q
11
+ end
@@ -0,0 +1,16 @@
1
+ system :dff do
2
+ input :clk, :rst, :d
3
+ output :q
4
+
5
+ par(clk.posedge) { q <= d & ~rst }
6
+ end
7
+
8
+ system :my_system do
9
+ input :clk, :rst
10
+ [bit, bit].inner :zig
11
+
12
+ dff(:dff0).(clk: clk, rst: rst)
13
+ dff(:dff1).(clk: clk, rst: rst)
14
+ dff0.d <= zig[0]
15
+ dff1.d <= zig[1]
16
+ end
@@ -0,0 +1,118 @@
1
+
2
+ require '../std/channel.rb'
3
+
4
+ include HDLRuby::High::Std
5
+
6
+ # Implementation of a handshaker channel transmitting generic values
7
+ channel(:handshaker) do |typ|
8
+ # The buffer holding the value to transmit
9
+ typ.inner :buf
10
+ # The handshaking lock signals.
11
+ # Each signal is modified one-sided (reader or writer),
12
+ # hence a double lock valid/ready is required.
13
+ inner :read_valid, :read_ready, :write_valid, :write_ready
14
+ # Sets the reader inputs ports.
15
+ reader_input :buf, :read_valid, :read_ready
16
+ # Sets the reader output ports.
17
+ reader_output :write_valid, :write_ready
18
+
19
+ # Sets the writer input ports.
20
+ writer_input :write_valid, :write_ready
21
+ # Sets the writer output ports.
22
+ writer_output :buf, :read_valid, :read_ready
23
+
24
+ # Defines the reset command for the channel.
25
+ command(:reset) do
26
+ par do
27
+ # Fully locked reader side.
28
+ read_valid <= 0
29
+ read_ready <= 0
30
+ # Fully unlocked writer side.
31
+ write_valid <= 1
32
+ write_ready <= 1
33
+ end
34
+ end
35
+
36
+ # Defines the reader's access procedure.
37
+ reader do |blk,target|
38
+ hif(read_valid) do
39
+ write_valid <= 0
40
+ write_ready <= 0
41
+ hif(read_ready) do
42
+ target <= buf
43
+ write_valid <= 1
44
+ blk.call if blk
45
+ end
46
+ end
47
+ helse { write_ready <= 1 }
48
+ end
49
+
50
+ # Defines the writer's access procedure.
51
+ writer do |blk,target|
52
+ hif(write_valid) do
53
+ read_valid <= 0
54
+ read_ready <= 0
55
+ hif(write_ready) do
56
+ buf <= target
57
+ read_valid <= 1
58
+ blk.call if blk
59
+ end
60
+ end
61
+ helse { read_ready <= 1 }
62
+ end
63
+ end
64
+
65
+
66
+
67
+
68
+ # A system writing indefinitely to a channel.
69
+ system :producer8 do |channel|
70
+ # puts "channel=#{channel}"
71
+ # Inputs of the producer: clock and reset.
72
+ input :clk, :rst
73
+ # Instantiate the channel ports
74
+ channel.writer_ports
75
+ # Inner 8-bit counter for generating values.
76
+ [8].inner :counter
77
+
78
+ # The value production process
79
+ par(clk.posedge) do
80
+ hif(rst) { counter <= 0 }
81
+ helse do
82
+ channel.write(counter) { counter <= counter + 1 }
83
+ end
84
+ end
85
+ end
86
+
87
+ # A system reading indefinitely from a channel.
88
+ system :consummer8 do |channel|
89
+ # Input of the consummer: a clock is enough.
90
+ input :clk
91
+ # Instantiate the channel ports
92
+ channel.reader_ports
93
+ # Inner buffer for storing the cunsummed value.
94
+ [8].inner :buf
95
+
96
+ # The value consumption process
97
+ par(clk.posedge) do
98
+ channel.read(buf)
99
+ end
100
+ end
101
+
102
+
103
+ # A system testing the handshaker.
104
+ system :hs_test do
105
+ input :clk,:rst
106
+
107
+ # Declares the handshaker
108
+ handshaker([8]).(:hs)
109
+
110
+ # Sets the reset.
111
+ hs.reset.at(rst.posedge)
112
+
113
+ # Instantiate the producer.
114
+ producer8(hs).(:producerI).(clk,rst,*hs.writer_signals)
115
+
116
+ # Instantiate the consummer.
117
+ consummer8(hs).(:consummerI).(clk,*hs.reader_signals)
118
+ end