HDLRuby 2.2.13 → 2.2.14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c52cf9ff8c35896992dd4e79059490544c3d41047235a31660badec7a5773ed
4
- data.tar.gz: 2ec8819e1dfa58be1e73ac35475de83973987627dc87b601820853c0926b8c3b
3
+ metadata.gz: a6a6e334b6e55bdc8f7947f92f4dd8a9de83fc0f90725bad5bfafedc27a8ca2e
4
+ data.tar.gz: a6f43c383176d02af9e8491c6b2425b5e1e8ca3c339464842dbf288fbe91dc26
5
5
  SHA512:
6
- metadata.gz: '0782e49ba89bacc5316f5bd1ab232b70740f33f51d9381ec82cbbd06fc8eaf4042202dbc9723576405594246786d1b0d7c69187f1918116d3af5eea20abea245'
7
- data.tar.gz: '000342564298bd2f46167c55f877deeab18e7b0c7282bce4e9a07b0485fde3fe3ea17beb5d0635d66c9ba47270ef3071dc222d58ced18e6f2d203adbe0d0dba1'
6
+ metadata.gz: 50a46ad334407428425912ec7b1fbd745d1de686e8792548524f23d4ca10f6252368b589f5fc77b201b07f1becf86aa7c234c77443b1014caad341c1fa0fa966
7
+ data.tar.gz: c8defb6937e32d43ddd0c56f49a2a608a8444a8ca0eef10f387fb1fc89597dc13871ce086223e8d1892799d1518d9a5cf915142e500cf4c74937bdfbfff68514
@@ -0,0 +1,272 @@
1
+ require 'std/memory.rb'
2
+
3
+ include HDLRuby::High::Std
4
+
5
+
6
+ # Sample code for testing the memory library.
7
+
8
+ system :memory_test do
9
+
10
+ # The test step counter.
11
+ [8].inner :step
12
+ # The success counter.
13
+ [4].inner :yay
14
+
15
+ # The clock and reset.
16
+ inner :clk, :rst
17
+
18
+ # The memory address.
19
+ [3].inner :address
20
+ # The value to write to memories.
21
+ [8].inner :value
22
+ # The general result register.
23
+ [8].inner :result
24
+ # The specific result registers.
25
+ [8].inner :res0, :res1, :res2, :res3, :res4, :res5, :res6, :res7
26
+
27
+ # Declares a one-ports synchronous memory.
28
+ mem_sync(1,[8],8,clk.negedge,rst,[:rst]).(:mem_sync_1I)
29
+ # And the corresponding access ports.
30
+ mem_sync_1I.branch(0).inner :mem_sync_1P
31
+
32
+ # Declares a dual-edge memory for address-based accesses.
33
+ mem_dual([8],8,clk,rst,raddr: :rst, waddr: :rst).(:mem_dual0I)
34
+ # And the corresponding access ports.
35
+ mem_dual0I.branch(:raddr).inner :mem_dual_raddrP
36
+ mem_dual0I.branch(:waddr).inner :mem_dual_waddrP
37
+
38
+ # Declares a second dual-edge memory for incremeted accesses.
39
+ mem_dual([8],8,clk,rst, rinc: :rst, winc: :rst).(:mem_dual1I)
40
+ # And the corresponding access ports.
41
+ mem_dual1I.branch(:rinc).inner :mem_dual_rincP
42
+ mem_dual1I.branch(:winc).inner :mem_dual_wincP
43
+
44
+ # Declares a thrid dual-edge memory for decremented accesses.
45
+ mem_dual([8],8,clk,rst, rdec: :rst, wdec: :rst).(:mem_dual2I)
46
+ # And the corresponding access ports.
47
+ mem_dual2I.branch(:rdec).inner :mem_dual_rdecP
48
+ mem_dual2I.branch(:wdec).inner :mem_dual_wdecP
49
+
50
+ # Declares a first register file for address-based accesses.
51
+ mem_file([8],8,clk,rst,raddr: :rst, waddr: :rst).(:mem_file0I)
52
+ # And the corresponding access ports.
53
+ mem_file0I.branch(:raddr).inner :mem_file_raddrP
54
+ mem_file0I.branch(:waddr).inner :mem_file_waddrP
55
+
56
+ # Declares a second register file for incremeted accesses.
57
+ mem_file([8],8,clk,rst, rinc: :rst, winc: :rst).(:mem_file1I)
58
+ # And the corresponding access ports.
59
+ mem_file1I.branch(:rinc).inner :mem_file_rincP
60
+ mem_file1I.branch(:winc).inner :mem_file_wincP
61
+
62
+ # Declares a third register file for decremeted accesses.
63
+ mem_file([8],8,clk,rst, rdec: :rst, wdec: :rst).(:mem_file2I)
64
+ # And the corresponding access ports.
65
+ mem_file2I.branch(:rdec).inner :mem_file_rdecP
66
+ mem_file2I.branch(:wdec).inner :mem_file_wdecP
67
+
68
+ # Declares a forth register file for num accesses.
69
+ mem_file([8],8,clk,rst, anum: :rst).(:mem_file3I)
70
+ # And the corresponding access port.
71
+ mem_file3I.branch(:anum).inner :mem_file_anumP
72
+
73
+ # Declares a fifth register file for num accesses.
74
+ mem_file([8],8,clk,rst, anum: :rst).(:mem_file4I)
75
+ # And the corresponding access port: individual accesses.
76
+ mem_file4I.branch(:anum).inner :mem_file_anum1P
77
+ mem_file_fixP = [ mem_file_anum1P.wrap(0), mem_file_anum1P.wrap(1),
78
+ mem_file_anum1P.wrap(2), mem_file_anum1P.wrap(3),
79
+ mem_file_anum1P.wrap(4), mem_file_anum1P.wrap(5),
80
+ mem_file_anum1P.wrap(6), mem_file_anum1P.wrap(7) ]
81
+
82
+
83
+ # Tests the accesses to the memories.
84
+ par(clk.posedge) do
85
+ # Initial address and value.
86
+ hif(rst) { address <= 0; value <= 0 }
87
+
88
+ # Handles the memory accesses.
89
+ hcase(step)
90
+ # Write to mem_sync_1
91
+ hwhen(1) do
92
+ mem_sync_1P.write(address,value) do
93
+ yay <= yay + 1
94
+ address <= address + 1
95
+ value <= value + 1
96
+ end
97
+ end
98
+ # Read from to mem_sync_1
99
+ hwhen(2) do
100
+ mem_sync_1P.read(address,result) do
101
+ yay <= yay + 1
102
+ address <= address + 1
103
+ end
104
+ end
105
+ # Write to mem_dual0 with address
106
+ hwhen(3) do
107
+ mem_dual_waddrP.write(address,value) do
108
+ yay <= yay + 1
109
+ address <= address + 1
110
+ value <= value + 1
111
+ end
112
+ end
113
+ # Read from mem_dual0 with address
114
+ hwhen(4) do
115
+ mem_dual_raddrP.read(address,result) do
116
+ yay <= yay + 1
117
+ address <= address + 1
118
+ end
119
+ end
120
+ # Write to mem_dual1 with increment
121
+ hwhen(5) do
122
+ mem_dual_wincP.write(value) do
123
+ yay <= yay + 1
124
+ value <= value + 1
125
+ end
126
+ end
127
+ # Read from mem_dual1 with increment
128
+ hwhen(6) do
129
+ mem_dual_rincP.read(result) do
130
+ yay <= yay + 1
131
+ end
132
+ end
133
+ # Write to mem_dual2 with decrement
134
+ hwhen(7) do
135
+ mem_dual_wdecP.write(value) do
136
+ yay <= yay + 1
137
+ value <= value + 1
138
+ end
139
+ end
140
+ # Read from mem_dual1 with decrement
141
+ hwhen(8) do
142
+ mem_dual_rdecP.read(result) do
143
+ yay <= yay + 1
144
+ end
145
+ end
146
+ # Write to mem_file0 with address
147
+ hwhen(9) do
148
+ mem_file_waddrP.write(address,value) do
149
+ yay <= yay + 1
150
+ address <= address + 1
151
+ value <= value + 1
152
+ end
153
+ end
154
+ # Read from mem_file0 with address
155
+ hwhen(10) do
156
+ mem_file_raddrP.read(address,result) do
157
+ yay <= yay + 1
158
+ address <= address + 1
159
+ end
160
+ end
161
+ # Write to mem_file1 with increment
162
+ hwhen(11) do
163
+ mem_file_wincP.write(value) do
164
+ yay <= yay + 1
165
+ value <= value + 1
166
+ end
167
+ end
168
+ # Read from mem_file1 with increment
169
+ hwhen(12) do
170
+ mem_file_rincP.read(result) do
171
+ yay <= yay + 1
172
+ end
173
+ end
174
+ # Write to mem_file2 with increment
175
+ hwhen(13) do
176
+ mem_file_wdecP.write(value) do
177
+ yay <= yay + 1
178
+ value <= value + 1
179
+ end
180
+ end
181
+ # Read from mem_file2 with increment
182
+ hwhen(14) do
183
+ mem_file_rdecP.read(result) do
184
+ yay <= yay + 1
185
+ end
186
+ end
187
+ # Write to mem_file3 with num access
188
+ hwhen(15) do
189
+ mem_file_anumP.write(0,0)
190
+ mem_file_anumP.write(1,1)
191
+ mem_file_anumP.write(2,2)
192
+ mem_file_anumP.write(3,3)
193
+ mem_file_anumP.write(4,4)
194
+ mem_file_anumP.write(5,5)
195
+ mem_file_anumP.write(6,6)
196
+ mem_file_anumP.write(7,7) do
197
+ yay <= 8
198
+ end
199
+ end
200
+ # Read from mem_file3 with num access
201
+ hwhen(16) do
202
+ mem_file_anumP.read(0,res0)
203
+ mem_file_anumP.read(1,res1)
204
+ mem_file_anumP.read(2,res2)
205
+ mem_file_anumP.read(3,res3)
206
+ mem_file_anumP.read(4,res4)
207
+ mem_file_anumP.read(5,res5)
208
+ mem_file_anumP.read(6,res6)
209
+ mem_file_anumP.read(7,res7) do
210
+ yay <= 8
211
+ end
212
+ end
213
+ # Write to mem_file3 with num access
214
+ hwhen(17) do
215
+ mem_file_fixP[0].write(1)
216
+ mem_file_fixP[1].write(2)
217
+ mem_file_fixP[2].write(4)
218
+ mem_file_fixP[3].write(8)
219
+ mem_file_fixP[4].write(16)
220
+ mem_file_fixP[5].write(32)
221
+ mem_file_fixP[6].write(64)
222
+ mem_file_fixP[7].write(128) do
223
+ yay <= 8
224
+ end
225
+ end
226
+ # Read from mem_file3 with num access
227
+ hwhen(18) do
228
+ mem_file_fixP[0].read(res0)
229
+ mem_file_fixP[1].read(res1)
230
+ mem_file_fixP[2].read(res2)
231
+ mem_file_fixP[3].read(res3)
232
+ mem_file_fixP[4].read(res4)
233
+ mem_file_fixP[5].read(res5)
234
+ mem_file_fixP[6].read(res6)
235
+ mem_file_fixP[7].read(res7) do
236
+ yay <= 8
237
+ end
238
+ end
239
+ end
240
+
241
+
242
+ timed do
243
+ # Initialize everything.
244
+ clk <= 0
245
+ rst <= 0
246
+ step <= 0
247
+ yay <= 0
248
+ !10.ns
249
+ clk <= 1
250
+ !10.ns
251
+ clk <= 0
252
+ rst <= 1
253
+ !10.ns
254
+ clk <= 1
255
+ !10.ns
256
+ clk <= 0
257
+ rst <= 0
258
+ step <= 1
259
+
260
+ # Testing the synchronous memories.
261
+ 256.times do
262
+ !10.ns
263
+ clk <= 1
264
+ !10.ns
265
+ hif(yay==8) do
266
+ step <= step + 1
267
+ yay <= 0
268
+ end
269
+ clk <= 0
270
+ end
271
+ end
272
+ end
@@ -82,10 +82,10 @@ module HDLRuby::High::Std
82
82
 
83
83
 
84
84
  ##
85
- # Module for boxing channel ports.
86
- module ChannelPortBoxing
87
- # Box with +args+ arguments.
88
- def box(*args)
85
+ # Module for wrapping channel ports.
86
+ module ChannelPortWrapping
87
+ # Wrap with +args+ arguments.
88
+ def wrap(*args)
89
89
  return ChannelPortB.new(self,*args)
90
90
  end
91
91
  end
@@ -94,7 +94,7 @@ module HDLRuby::High::Std
94
94
  ##
95
95
  # Describes a read port to a channel.
96
96
  class ChannelPortR
97
- include ChannelPortBoxing
97
+ include ChannelPortWrapping
98
98
 
99
99
  # Creates a new channel reader running in +namespace+ and
100
100
  # reading using +reader_proc+ and reseting using +reseter_proc+.
@@ -138,7 +138,7 @@ module HDLRuby::High::Std
138
138
  ##
139
139
  # Describes a writer port to a channel.
140
140
  class ChannelPortW
141
- include ChannelPortBoxing
141
+ include ChannelPortWrapping
142
142
 
143
143
  # Creates a new channel writer running in +namespace+ and
144
144
  # writing using +writer_proc+ and reseting using +reseter_proc+.
@@ -182,7 +182,7 @@ module HDLRuby::High::Std
182
182
  ##
183
183
  # Describes an access port to a channel.
184
184
  class ChannelPortA
185
- include ChannelPortBoxing
185
+ include ChannelPortWrapping
186
186
 
187
187
  # Creates a new channel accesser running in +namespace+
188
188
  # and reading using +reader_proc+, writing using +writer_proc+,
@@ -242,32 +242,61 @@ module HDLRuby::High::Std
242
242
 
243
243
 
244
244
  ##
245
- # Describes port box (wrapper) for fixing arugments.
245
+ # Describes port wrapper (Box) for fixing arugments.
246
246
  class ChannelPortB
247
- include ChannelPortBoxing
247
+ include ChannelPortWrapping
248
248
 
249
249
  # Creates a new channel box over channel port +port+ fixing +args+
250
250
  # as arguments.
251
+ # +args+ is a list of arguments to apply to all read, write
252
+ # and access procedure, nil values meaning that the corresponding
253
+ # argument is not overwritten.
254
+ # It can also be three lists for seperate read, write and access
255
+ # procedures using named arguments as:
256
+ # read: <read arguments>, write: <write arguments>,
257
+ # access: <access arguments>
251
258
  def initialize(port,*args)
252
259
  # Ensure port is a channel port.
253
260
  unless port.is_a?(ChannelPortR) || port.is_a?(ChannelPortW) ||
254
- port.is_a?(ChannelPortA)
261
+ port.is_a?(ChannelPortA) || port.is_a?(ChannelPortB)
255
262
  raise "Invalid class for a channel port: #{port.class}"
256
263
  end
257
264
  @port = port
258
- @args = args
265
+ # Process the arguments.
266
+ if args.size == 1 && args[0].is_a?(Hash) then
267
+ # Read, write and access are separated.
268
+ @args_read = args[0][:read]
269
+ @args_write = args[0][:write]
270
+ @args_access = args[0][:access]
271
+ else
272
+ @args_read = args
273
+ @args_write = args.clone
274
+ @args_access = args.clone
275
+ end
259
276
  end
260
277
 
261
278
  ## Performs a read on the channel using +args+ and +ruby_block+
262
279
  # as arguments.
263
280
  def read(*args,&ruby_block)
264
- @port.read(*@args,*args)
281
+ # Generate the final arguments: fills the nil with arguments
282
+ # from args
283
+ rargs = @args_read.clone
284
+ rargs.map! { |arg| arg == nil ? args.shift : arg }
285
+ # And add the remaining at the tail.
286
+ rargs += args
287
+ @port.read(*rargs,&ruby_block)
265
288
  end
266
289
 
267
290
  ## Performs a write on the channel using +args+ and +ruby_block+
268
291
  # as arguments.
269
292
  def write(*args,&ruby_block)
270
- @port.write(*@args,*args)
293
+ # Generate the final arguments: fills the nil with arguments
294
+ # from args
295
+ rargs = @args_write.clone
296
+ rargs.map! { |arg| arg == nil ? args.shift : arg }
297
+ # And add the remaining at the tail.
298
+ rargs += args
299
+ @port.write(*rargs,&ruby_block)
271
300
  end
272
301
 
273
302
  ## Performs a reset on the channel using +args+ and +ruby_block+
@@ -243,23 +243,14 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
243
243
  typ.inner :dbus_r, :dbus_w
244
244
  # Address buses (or simply registers)
245
245
  [awidth].inner :abus_r, :abus_w
246
- # # Address buffers
247
- # [awidth].inner :abus_r_reg
248
246
 
249
247
  # Declare the memory content.
250
248
  typ[-size].inner :mem
251
249
 
252
- # # Processes handling the memory access.
253
- par(clk.posedge) do
254
- # # # Output memory value for reading at each cycle.
255
- # # dbus_r <= mem[abus_r_reg]
256
- # Manage the write to the memory.
257
- hif(trig_w) { mem[abus_w] <= dbus_w }
258
- end
259
- # par(clk.negedge) { abus_r_reg <= abus_r }
250
+ # Processes handling the memory access.
260
251
  par(clk.negedge) do
261
252
  dbus_r <= mem[abus_r]
262
- # hif(trig_w) { mem[abus_w] <= dbus_w }
253
+ hif(trig_w) { mem[abus_w] <= dbus_w }
263
254
  end
264
255
 
265
256
  # The address branches.
@@ -403,10 +394,7 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
403
394
  par do
404
395
  hif(rst == 0) do
405
396
  # No reset, so can perform the write.
406
- hif(trig_w == 1) do
407
- # The trigger was previously set, write ok.
408
- blk.call
409
- end if blk
397
+ blk.call if blk
410
398
  # Prepare the write.
411
399
  abus_w <= abus_w + 1
412
400
  trig_w <= 1
@@ -416,6 +404,84 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
416
404
  end
417
405
  end
418
406
 
407
+
408
+ # The decrement branches.
409
+ # Read with increment
410
+ brancher(:rdec) do
411
+ reader_output :trig_r, :abus_r
412
+ reader_input :dbus_r
413
+ if br_rsts[:rdec] then
414
+ rst_name = br_rsts[:rdec].to_sym
415
+ else
416
+ rst_name = rst.name
417
+ reader_input rst_name
418
+ end
419
+
420
+ # Defines the read procedure at address +addr+
421
+ # using +target+ as target of access result.
422
+ reader do |blk,target|
423
+ # By default the read trigger is 0.
424
+ rst = send(rst_name)
425
+ top_block.unshift do
426
+ # Initialize the address so that the next access is at address 0.
427
+ hif(rst==1) { abus_r <= 0 }
428
+ # Reset so switch of the access trigger.
429
+ trig_r <= 0
430
+ end
431
+ # The read procedure.
432
+ par do
433
+ hif(rst == 0) do
434
+ # No reset, so can perform the read.
435
+ hif(trig_r == 1) do
436
+ # The trigger was previously set, read ok.
437
+ target <= dbus_r
438
+ blk.call if blk
439
+ end
440
+ # Prepare the read.
441
+ abus_r <= abus_r - 1
442
+ trig_r <= 1
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ # Write with address
449
+ brancher(:wdec) do
450
+ writer_output :trig_w, :abus_w, :dbus_w
451
+ if br_rsts[:wdec] then
452
+ rst_name = br_rsts[:wdec].to_sym
453
+ else
454
+ rst_name = rst.name
455
+ writer_input rst_name
456
+ end
457
+ # puts "br_rsts=#{br_rsts}"
458
+ # puts "rst_name=#{rst_name}"
459
+
460
+ # Defines the read procedure at address +addr+
461
+ # using +target+ as target of access result.
462
+ writer do |blk,target|
463
+ # By default the read trigger is 0.
464
+ rst = send(rst_name)
465
+ top_block.unshift do
466
+ # Initialize the address so that the next access is at address 0.
467
+ hif(rst == 1) { abus_w <= 0 }
468
+ # Reset so switch of the access trigger.
469
+ trig_w <= 0
470
+ end
471
+ # The write procedure.
472
+ par do
473
+ hif(rst == 0) do
474
+ # No reset, so can perform the write.
475
+ blk.call if blk
476
+ # Prepare the write.
477
+ abus_w <= abus_w - 1
478
+ trig_w <= 1
479
+ dbus_w <= target
480
+ end
481
+ end
482
+ end
483
+ end
484
+
419
485
  end
420
486
 
421
487
 
@@ -436,8 +502,7 @@ end
436
502
  #
437
503
  # * The following branches are possible (only one read and one write can
438
504
  # be used per channel)
439
- # - rnum: read by register number, the number must be a defined value.
440
- # - wnum: writer by register number, the number must be a defined value.
505
+ # - anum: access by register number, the number must be a defined value.
441
506
  # - raddr: read by address
442
507
  # - waddr: read by address
443
508
  # - rinc: read by automatically incremented address.
@@ -536,7 +601,6 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
536
601
  # Read with address
537
602
  brancher(:raddr) do
538
603
  size.times { |i| reader_input :"reg_#{i}" }
539
- regs = size.times.map {|i| send(:"reg_#{i}") }
540
604
  if br_rsts[:raddr] then
541
605
  rst_name = br_rsts[:raddr].to_sym
542
606
  else
@@ -547,6 +611,7 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
547
611
  # Defines the read procedure at address +addr+
548
612
  # using +target+ as target of access result.
549
613
  reader do |blk,addr,target|
614
+ regs = size.times.map {|i| send(:"reg_#{i}") }
550
615
  # The read procedure.
551
616
  rst = send(rst_name)
552
617
  par do
@@ -565,7 +630,6 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
565
630
  # Write with address
566
631
  brancher(:waddr) do
567
632
  size.times { |i| writer_output :"reg_#{i}" }
568
- regs = size.times.map {|i| send(:"reg_#{i}") }
569
633
  if br_rsts[:waddr] then
570
634
  rst_name = br_rsts[:waddr].to_sym
571
635
  else
@@ -576,6 +640,7 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
576
640
  # Defines the writer procedure at address +addr+
577
641
  # using +target+ as target of access.
578
642
  writer do |blk,addr,target|
643
+ regs = size.times.map {|i| send(:"reg_#{i}") }
579
644
  # The writer procedure.
580
645
  rst = send(rst_name)
581
646
  par do
@@ -672,4 +737,83 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
672
737
  end
673
738
 
674
739
 
740
+ # The decrement branches.
741
+ # Read with decrement
742
+ brancher(:rdec) do
743
+ size.times { |i| reader_input :"reg_#{i}" }
744
+ if br_rsts[:rdec] then
745
+ rst_name = br_rsts[:rdec].to_sym
746
+ else
747
+ rst_name = rst.name
748
+ reader_input rst_name
749
+ end
750
+ # Declares the address counter.
751
+ [size.width-1].inner :abus_r
752
+ reader_inout :abus_r
753
+
754
+ # Defines the read procedure at address +addr+
755
+ # using +target+ as target of access result.
756
+ reader do |blk,target|
757
+ regs = size.times.map {|i| send(:"reg_#{i}") }
758
+ # By default the read trigger is 0.
759
+ rst = send(rst_name)
760
+ top_block.unshift do
761
+ # Initialize the address so that the next access is at address 0.
762
+ hif(rst==1) { abus_r <= -1 }
763
+ end
764
+ # The read procedure.
765
+ par do
766
+ hif(rst == 0) do
767
+ # No reset, so can perform the read.
768
+ hcase(abus_r)
769
+ size.times do |i|
770
+ hwhen(i) { target <= regs[i] }
771
+ end
772
+ blk.call if blk
773
+ # Prepare the next read.
774
+ abus_r <= abus_r - 1
775
+ end
776
+ end
777
+ end
778
+ end
779
+
780
+ # Write with decrement
781
+ brancher(:wdec) do
782
+ size.times { |i| writer_output :"reg_#{i}" }
783
+ if br_rsts[:wdec] then
784
+ rst_name = br_rsts[:wdec].to_sym
785
+ else
786
+ rst_name = rst.name
787
+ reader_input rst_name
788
+ end
789
+ # Declares the address counter.
790
+ [size.width-1].inner :abus_w
791
+ reader_inout :abus_w
792
+
793
+ # Defines the write procedure at address +addr+
794
+ # using +target+ as target of access result.
795
+ writer do |blk,target|
796
+ regs = size.times.map {|i| send(:"reg_#{i}") }
797
+ # By default the read trigger is 0.
798
+ rst = send(rst_name)
799
+ top_block.unshift do
800
+ # Initialize the address so that the next access is at address 0.
801
+ hif(rst==1) { abus_w <= -1 }
802
+ end
803
+ # The read procedure.
804
+ par do
805
+ hif(rst == 0) do
806
+ # No reset, so can perform the read.
807
+ hcase(abus_w)
808
+ size.times do |i|
809
+ hwhen(i) { regs[i] <= target }
810
+ end
811
+ blk.call if blk
812
+ # Prepare the next write.
813
+ abus_w <= abus_w - 1
814
+ end
815
+ end
816
+ end
817
+ end
818
+
675
819
  end
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.2.13"
2
+ VERSION = "2.2.14"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HDLRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.13
4
+ version: 2.2.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-25 00:00:00.000000000 Z
11
+ date: 2020-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,6 +84,7 @@ files:
84
84
  - lib/HDLRuby/hdr_samples/instance_open.rb
85
85
  - lib/HDLRuby/hdr_samples/mei8.rb
86
86
  - lib/HDLRuby/hdr_samples/mei8_bench.rb
87
+ - lib/HDLRuby/hdr_samples/memory_test.rb
87
88
  - lib/HDLRuby/hdr_samples/multer_gen.rb
88
89
  - lib/HDLRuby/hdr_samples/multer_seq.rb
89
90
  - lib/HDLRuby/hdr_samples/neural/a.rb