HDLRuby 2.11.12 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.html +3274 -0
  3. data/README.md +556 -84
  4. data/ext/hruby_sim/hruby_sim_calc.c +2 -0
  5. data/lib/HDLRuby/backend/hruby_allocator.rb +2 -2
  6. data/lib/HDLRuby/backend/hruby_c_allocator.rb +7 -7
  7. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
  8. data/lib/HDLRuby/hdr_samples/with_bram.rb +3 -3
  9. data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +105 -0
  10. data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +69 -0
  11. data/lib/HDLRuby/hdr_samples/with_register_stack.rb +150 -0
  12. data/lib/HDLRuby/hdr_samples/with_sequencer.rb +190 -0
  13. data/lib/HDLRuby/hdr_samples/with_sequencer_deep.rb +91 -0
  14. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +405 -0
  15. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +89 -0
  16. data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +120 -0
  17. data/lib/HDLRuby/hdrcc.rb +15 -2
  18. data/lib/HDLRuby/hdrlib.rb +1 -1
  19. data/lib/HDLRuby/hruby_db.rb +2 -2
  20. data/lib/HDLRuby/hruby_high.rb +38 -20
  21. data/lib/HDLRuby/hruby_high_fullname.rb +3 -1
  22. data/lib/HDLRuby/hruby_low.rb +2 -2
  23. data/lib/HDLRuby/hruby_low2c.rb +58 -43
  24. data/lib/HDLRuby/hruby_low2hdr.rb +66 -40
  25. data/lib/HDLRuby/hruby_low2high.rb +86 -44
  26. data/lib/HDLRuby/hruby_low2seq.rb +26 -18
  27. data/lib/HDLRuby/hruby_low2sym.rb +14 -13
  28. data/lib/HDLRuby/hruby_low2vhd.rb +78 -43
  29. data/lib/HDLRuby/hruby_low_bool2select.rb +61 -46
  30. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +56 -44
  31. data/lib/HDLRuby/hruby_low_cleanup.rb +18 -16
  32. data/lib/HDLRuby/hruby_low_fix_types.rb +64 -32
  33. data/lib/HDLRuby/hruby_low_mutable.rb +53 -118
  34. data/lib/HDLRuby/hruby_low_resolve.rb +26 -31
  35. data/lib/HDLRuby/hruby_low_with_bool.rb +33 -16
  36. data/lib/HDLRuby/hruby_low_with_port.rb +3 -3
  37. data/lib/HDLRuby/hruby_low_with_var.rb +23 -9
  38. data/lib/HDLRuby/hruby_low_without_concat.rb +19 -13
  39. data/lib/HDLRuby/hruby_low_without_namespace.rb +47 -32
  40. data/lib/HDLRuby/hruby_low_without_parinseq.rb +18 -12
  41. data/lib/HDLRuby/hruby_low_without_select.rb +36 -23
  42. data/lib/HDLRuby/hruby_low_without_subsignals.rb +29 -28
  43. data/lib/HDLRuby/hruby_rcsim.rb +79 -64
  44. data/lib/HDLRuby/hruby_rsim.rb +64 -15
  45. data/lib/HDLRuby/hruby_rsim_mute.rb +2 -3
  46. data/lib/HDLRuby/hruby_rsim_vcd.rb +28 -25
  47. data/lib/HDLRuby/hruby_values.rb +13 -2
  48. data/lib/HDLRuby/hruby_verilog.rb +90 -48
  49. data/lib/HDLRuby/soft/stacks.rb +219 -0
  50. data/lib/HDLRuby/std/bram.rb +9 -5
  51. data/lib/HDLRuby/std/clocks.rb +1 -1
  52. data/lib/HDLRuby/std/fsm.rb +29 -9
  53. data/lib/HDLRuby/std/sequencer.rb +1857 -0
  54. data/lib/HDLRuby/std/sequencer_sync.rb +400 -0
  55. data/lib/HDLRuby/std/std.rb +12 -0
  56. data/lib/HDLRuby/version.rb +1 -1
  57. data/tuto/adder_sat_flags_vcd.png +0 -0
  58. data/tuto/addsub_vcd.png +0 -0
  59. data/tuto/alu_vcd.png +0 -0
  60. data/tuto/bit_pong_vcd.png +0 -0
  61. data/tuto/checksum_vcd.png +0 -0
  62. data/tuto/circuit_hdr.odg +0 -0
  63. data/tuto/circuit_hdr.png +0 -0
  64. data/tuto/circuit_hie.odg +0 -0
  65. data/tuto/circuit_hie.png +0 -0
  66. data/tuto/circuit_view.odg +0 -0
  67. data/tuto/circuit_view.png +0 -0
  68. data/tuto/clock_counter_vcd.png +0 -0
  69. data/tuto/counter_ext_vcd.png +0 -0
  70. data/tuto/fact_vcd.png +0 -0
  71. data/tuto/hw_flow.odg +0 -0
  72. data/tuto/hw_flow.png +0 -0
  73. data/tuto/maxxer_vcd.png +0 -0
  74. data/tuto/pingpong0_vcd.png +0 -0
  75. data/tuto/pingpong1_vcd.png +0 -0
  76. data/tuto/pingpong2_vcd.png +0 -0
  77. data/tuto/ram_vcd.png +0 -0
  78. data/tuto/serializer_vcd.png +0 -0
  79. data/tuto/sw_flow.odg +0 -0
  80. data/tuto/sw_flow.png +0 -0
  81. data/tuto/the_counter_vcd.png +0 -0
  82. data/tuto/tutorial_sw.html +2359 -0
  83. data/tuto/tutorial_sw.md +2684 -0
  84. data/tuto/tutorial_sw.pdf +0 -0
  85. data/tuto/tutorial_sw_jp.md +417 -0
  86. metadata +44 -2
@@ -1777,6 +1777,8 @@ Value write_range_bitstring_no_z(Value src,
1777
1777
  unsigned long long bw = type_width(base);
1778
1778
  first *= bw;
1779
1779
  last *= bw;
1780
+ last += bw-1;
1781
+ // printf("bw=%lld, first=%lld, last=%lld\n",bw,first,last);
1780
1782
  /* Access the source and destination bitstring data. */
1781
1783
  char* dst_data = dst->data_str;
1782
1784
  char* src_data = src->data_str;
@@ -1,14 +1,14 @@
1
1
  require "HDLRuby/hruby_error"
2
2
 
3
+ module HDLRuby::Low
3
4
 
4
5
 
5
6
  ##
6
7
  # Adds methods for allocating addresses to signals in Code objects.
7
8
  #
8
9
  ########################################################################
9
- module HDLRuby::Low
10
10
 
11
- ## An allocator.
11
+ ## Describes an allocator.
12
12
  class Allocator
13
13
 
14
14
  # The space range for the allocation.
@@ -3,16 +3,16 @@ require "HDLRuby/hruby_low_resolve"
3
3
  require "HDLRuby/backend/hruby_allocator"
4
4
 
5
5
 
6
+ module HDLRuby::Low
6
7
 
7
8
  ##
8
9
  # Adds methods for allocating addresses to signals in Code objects and
9
10
  # integrate the result into C code.
10
11
  #
11
12
  ########################################################################
12
- module HDLRuby::Low
13
13
 
14
- ## Extends the SystemT class with support for C allocation of signals.
15
14
  class SystemT
15
+ ## Extends the SystemT class with support for C allocation of signals.
16
16
 
17
17
  ## Allocates signals within C code using +allocator+.
18
18
  def c_code_allocate(allocator)
@@ -21,8 +21,8 @@ module HDLRuby::Low
21
21
  end
22
22
 
23
23
 
24
- ## Extends the scope class with support for C allocation of signals.
25
24
  class Scope
25
+ ## Extends the scope class with support for C allocation of signals.
26
26
 
27
27
  ## Allocates signals within C code using +allocator+.
28
28
  def c_code_allocate(allocator)
@@ -34,10 +34,10 @@ module HDLRuby::Low
34
34
  end
35
35
 
36
36
 
37
- ## Extends the chunk class with support for self modification with
38
- # allocation.
39
- # NOTE: only work if the chunk is in C language.
40
37
  class Chunk
38
+ ## Extends the chunk class with support for self modification with
39
+ # allocation.
40
+ # NOTE: only works if the chunk is in C language.
41
41
 
42
42
  ## Allocates signal within C code using +allocator+ and self-modify
43
43
  # the code correspondingly.
@@ -61,8 +61,8 @@ module HDLRuby::Low
61
61
  end
62
62
 
63
63
 
64
- ## Extends the code class with support for C allocation of signals.
65
64
  class Code
65
+ ## Extends the code class with support for C allocation of signals.
66
66
 
67
67
  ## Allocates signals within C code using +allocator+.
68
68
  def c_code_allocate(allocator)
@@ -28,7 +28,7 @@ system :mei8 do |prog_file = "./prog.obj"|
28
28
  bit[7..0][-256].constant mem: # The content of the memory
29
29
  ( File.readlines(prog_file).map {|l| l.split[0] }.select do |l|
30
30
  ["0","1"].include?(l[2])
31
- end.map {|l| l[2..9].to_i(2) } )
31
+ end.map {|l| l[2..9].to_i(2).to_expr.as(bit[8]) } )
32
32
  instr <= mem[addr] # The access procedure
33
33
  end
34
34
 
@@ -18,13 +18,13 @@ system :bram_test do
18
18
 
19
19
  timed do
20
20
  clk <= 0
21
- rwb <= 1
21
+ rwb <= 0
22
22
  addr <= 0
23
23
  din <= 0
24
24
  !10.ns
25
25
  clk <= 1
26
26
  !10.ns
27
- rwb <= 1
27
+ rwb <= 0
28
28
  repeat(16) do
29
29
  clk <= 0
30
30
  !10.ns
@@ -33,7 +33,7 @@ system :bram_test do
33
33
  din <= din + 1
34
34
  !10.ns
35
35
  end
36
- rwb <= 0
36
+ rwb <= 1
37
37
  repeat(16) do
38
38
  clk <= 0
39
39
  !10.ns
@@ -0,0 +1,105 @@
1
+ require 'soft/stacks.rb'
2
+
3
+ include HDLRuby::High::Soft
4
+
5
+
6
+ # A system testing the bram-based stack.
7
+ system :bram_stach_test do
8
+
9
+ widthD = 8
10
+ size = 1024
11
+ depth = 16
12
+
13
+
14
+ input :clk, :rst, :ce
15
+ [2].inner :cmd
16
+ { frame: bit[depth.width], offset: bit[size.width] }.inner :loc
17
+ [size.width].inner :frame_size
18
+ [widthD].inner :din,:dout
19
+ inner :empty, :full
20
+
21
+ bram_frame_stack(widthD,size,depth).(:stack0).(clk,rst,ce,cmd,loc,din,dout,empty,full)
22
+
23
+ timed do
24
+ clk <= 0
25
+ rst <= 0
26
+ ce <= 0
27
+ cmd <= READ
28
+ loc.frame <= 0
29
+ loc.offset <= 0
30
+ frame_size <= 0
31
+ din <= 0
32
+ !10.ns
33
+ clk <= 1
34
+ !10.ns
35
+ clk <= 0
36
+ rst <= 1
37
+ !10.ns
38
+ clk <= 1
39
+ !10.ns
40
+ clk <= 0
41
+ rst <= 0
42
+ !10.ns
43
+ clk <= 1
44
+ repeat(9) do
45
+ !10.ns
46
+ clk <= 0
47
+ ce <= 1
48
+ cmd <= PUSH
49
+ frame_size <= frame_size + 16
50
+ loc.offset <= frame_size
51
+ !10.ns
52
+ clk <= 1
53
+ !10.ns
54
+ clk <= 0
55
+ cmd <= WRITE
56
+ din <= 5
57
+ loc.frame <= 0
58
+ loc.offset <= 1
59
+ !10.ns
60
+ clk <= 1
61
+ !10.ns
62
+ clk <= 0
63
+ cmd <= READ
64
+ loc.frame <= 0
65
+ loc.offset <= 1
66
+ !10.ns
67
+ clk <= 1
68
+ !10.ns
69
+ clk <= 0
70
+ cmd <= WRITE
71
+ din <= 55
72
+ loc.frame <= 1
73
+ loc.offset <= 14
74
+ !10.ns
75
+ clk <= 1
76
+ !10.ns
77
+ clk <= 0
78
+ cmd <= READ
79
+ loc.frame <= 1
80
+ loc.offset <= 14
81
+ !10.ns
82
+ clk <= 1
83
+ end
84
+ !10.ns
85
+ clk <= 0
86
+ ce <= 0
87
+ !10.ns
88
+ clk <= 1
89
+ repeat(9) do
90
+ !10.ns
91
+ clk <= 0
92
+ ce <= 1
93
+ cmd <= POP
94
+ !10.ns
95
+ clk <= 1
96
+ end
97
+ !10.ns
98
+ clk <= 0
99
+ ce <= 0
100
+ !10.ns
101
+ clk <= 1
102
+ !10.ns
103
+ end
104
+
105
+ end
@@ -0,0 +1,69 @@
1
+ require 'soft/stacks.rb'
2
+
3
+ include HDLRuby::High::Soft
4
+
5
+
6
+ # A system testing the bram-based stack.
7
+ system :bram_stach_test do
8
+
9
+ size = 8
10
+ widthD = 8
11
+
12
+
13
+ input :clk, :rst, :ce
14
+ inner :cmd
15
+ [widthD].inner :din,:dout
16
+ inner :empty, :full
17
+
18
+ bram_stack(widthD,size).(:stack0).(clk,rst,ce,cmd,din,dout,empty,full)
19
+
20
+ timed do
21
+ clk <= 0
22
+ rst <= 0
23
+ ce <= 0
24
+ cmd <= PUSH
25
+ din <= 0
26
+ !10.ns
27
+ clk <= 1
28
+ !10.ns
29
+ clk <= 0
30
+ rst <= 1
31
+ !10.ns
32
+ clk <= 1
33
+ !10.ns
34
+ clk <= 0
35
+ rst <= 0
36
+ din <= 0
37
+ !10.ns
38
+ clk <= 1
39
+ repeat(9) do
40
+ !10.ns
41
+ clk <= 0
42
+ ce <= 1
43
+ cmd <= PUSH
44
+ din <= din + 1
45
+ !10.ns
46
+ clk <= 1
47
+ end
48
+ !10.ns
49
+ clk <= 0
50
+ ce <= 0
51
+ !10.ns
52
+ clk <= 1
53
+ repeat(9) do
54
+ !10.ns
55
+ clk <= 0
56
+ ce <= 1
57
+ cmd <= POP
58
+ !10.ns
59
+ clk <= 1
60
+ end
61
+ !10.ns
62
+ clk <= 0
63
+ ce <= 0
64
+ !10.ns
65
+ clk <= 1
66
+ !10.ns
67
+ end
68
+
69
+ end
@@ -0,0 +1,150 @@
1
+ require 'soft/stacks.rb'
2
+
3
+ include HDLRuby::High::Soft
4
+
5
+
6
+ # A system testing the bram-based stack.
7
+ system :register_stack_test do
8
+
9
+ widthA = 3
10
+ size = 2**widthA
11
+ widthD = 8
12
+
13
+
14
+ input :clk,:rst,:ce
15
+ [2].inner :cmd
16
+ [widthD].inner :din,:dout
17
+ inner :empty, :full
18
+ douts = size.times.map { |i| [widthD].inner :"dout#{i}" }
19
+
20
+ register_stack(widthA,widthD,size).(:stackI).(clk,rst,ce,cmd,din,dout,empty,full,*douts)
21
+
22
+ [widthD].inner :count # Additional counter for the test.
23
+
24
+ timed do
25
+ clk <= 0
26
+ ce <= 0
27
+ rst <= 0
28
+ cmd <= READ
29
+ din <= 0
30
+ !10.ns
31
+ clk <= 1
32
+ !10.ns
33
+ clk <= 0
34
+ rst <= 1
35
+ !10.ns
36
+ clk <= 1
37
+ !10.ns
38
+ clk <= 0
39
+ rst <= 0
40
+ ce <= 1
41
+ din <= 1
42
+ !10.ns
43
+ clk <= 1
44
+ repeat(9) do
45
+ !10.ns
46
+ clk <= 0
47
+ cmd <= PUSH
48
+ din <= din + 1
49
+ !10.ns
50
+ clk <= 1
51
+ end
52
+ !10.ns
53
+ clk <= 0
54
+ !10.ns
55
+ clk <= 1
56
+ din <= -1
57
+ repeat(8) do
58
+ !10.ns
59
+ clk <= 0
60
+ cmd <= READ
61
+ din <= din + 1
62
+ !10.ns
63
+ clk <= 1
64
+ end
65
+ !10.ns
66
+ clk <= 0
67
+ !10.ns
68
+ clk <= 1
69
+ count <= 0
70
+ repeat(4) do
71
+ !10.ns
72
+ clk <= 0
73
+ din <= 1
74
+ cmd <= POP
75
+ !10.ns
76
+ clk <= 1
77
+ !10.ns
78
+ clk <= 0
79
+ count <= count + 1
80
+ din <= count
81
+ cmd <= PUSH
82
+ !10.ns
83
+ clk <= 1
84
+ end
85
+ !10.ns
86
+ clk <= 0
87
+ !10.ns
88
+ clk <= 1
89
+ repeat(9) do
90
+ !10.ns
91
+ clk <= 0
92
+ din <= 1
93
+ cmd <= POP
94
+ !10.ns
95
+ clk <= 1
96
+ end
97
+ !10.ns
98
+ clk <= 0
99
+ din <= _b8hAA
100
+ cmd <= PUSH
101
+ !10.ns
102
+ clk <= 1
103
+ !10.ns
104
+ clk <= 0
105
+ din <= 7
106
+ cmd <= WRITE
107
+ !10.ns
108
+ clk <= 1
109
+ din <= -1
110
+ repeat(8) do
111
+ !10.ns
112
+ clk <= 0
113
+ cmd <= WRITE
114
+ din <= din + 1
115
+ !10.ns
116
+ clk <= 1
117
+ end
118
+ !10.ns
119
+ clk <= 0
120
+ din <= size-1
121
+ cmd <= READ
122
+ !10.ns
123
+ clk <= 1
124
+ !10.ns
125
+ clk <= 0
126
+ din <= -3
127
+ cmd <= POP
128
+ !10.ns
129
+ clk <= 1
130
+ !10.ns
131
+ clk <= 0
132
+ din <= 31
133
+ cmd <= PUSH
134
+ !10.ns
135
+ clk <= 1
136
+ !10.ns
137
+ clk <= 0
138
+ din <= 3
139
+ cmd <= POP
140
+ !10.ns
141
+ clk <= 1
142
+ !10.ns
143
+ clk <= 0
144
+ din <= size-1
145
+ cmd <= READ
146
+ !10.ns
147
+ clk <= 1
148
+ end
149
+
150
+ end
@@ -0,0 +1,190 @@
1
+ require 'std/sequencer.rb'
2
+
3
+ include HDLRuby::High::Std
4
+
5
+ # Checking the usage of sequencers:
6
+ # - One sequencer computes a fibbnacci series until 100
7
+ # - One sequencer computes a fibbnacci series until 1000 with early termination
8
+ # for testing sterminate.
9
+ # - One sequencer computes a fibbnacci series until 1000 with ealry break
10
+ # for testing sbreak.
11
+ # - One sequence that increase a first counter and the other one every four
12
+ # increases of the first one for testing scontinue.
13
+ # - One sequencer computes the square value of each elements of a buffer.
14
+ # - One sequencer computes the square value of each elements of a range.
15
+ # - One sequencer concatenates the value of a counter with its index.
16
+ # - One sequencer puts the sum of two arrays in a third one.
17
+ # - One sequencer iterates over two arrays.
18
+ # - One sequencer iterates downward.
19
+ system :my_seqencer do
20
+
21
+ inner :clk,:rst
22
+ [16].inner :u, :v,:res0
23
+
24
+ sequencer(clk.posedge,rst) do
25
+ hprint("#0\n")
26
+ u <= 0
27
+ v <= 1
28
+ step
29
+ res0 <= 0
30
+ hprint("#1 res0=",res0,"\n")
31
+ swhile(v < 100) do
32
+ v <= u + v
33
+ u <= v - u
34
+ hprint("#2 v=",v,"\n")
35
+ end
36
+ res0 <= v
37
+ hprint("#3 res0=",res0,"\n")
38
+ end
39
+
40
+ [16].inner :uu, :vv
41
+ sequencer(clk.posedge,rst) do
42
+ hprint("##0\n")
43
+ uu <= 0
44
+ vv <= 1
45
+ swhile(vv<10000) do
46
+ vv <= uu + vv
47
+ uu <= vv - uu
48
+ step
49
+ hprint("##1 vv=",vv,"\n")
50
+ sif(vv >= 100) { sterminate }
51
+ end
52
+ hprint("##2 vv=",vv,"... But should not be here!\n")
53
+ end
54
+
55
+ [16].inner :uuu, :vvv, :res00
56
+
57
+ sequencer(clk.posedge,rst) do
58
+ hprint("###0\n")
59
+ res00 <= 0
60
+ uuu <= 0
61
+ vvv <= 1
62
+ swhile(vvv<10000) do
63
+ vvv <= uuu + vvv
64
+ uuu <= vvv - uuu
65
+ step
66
+ hprint("##1 vvv=",vvv,"\n")
67
+ sif(vvv >= 100) { sbreak }
68
+ selse { res00 <= res00 + 1 }
69
+ end
70
+ hprint("##2 res00=",res00,"... and should be here!\n")
71
+ end
72
+
73
+ [8].inner :a,:b
74
+
75
+ sequencer(clk.posedge,rst) do
76
+ hprint("=0\n")
77
+ a <= 0
78
+ b <= 0
79
+ sfor(0..19) do
80
+ a <= a + 1
81
+ hprint("=1 a=",a,"\n")
82
+ sif(a % 4) { scontinue }
83
+ b <= b + 1
84
+ hprint("=2 b=",b,"\n")
85
+ end
86
+ hprint("=3 a=",a," b=",b,"\n")
87
+ end
88
+
89
+
90
+ bit[16][-8].inner buf: 8.times.map {|i| i.to_expr.as(bit[16]) }
91
+ [16].inner :res1
92
+ # [8].inner :idx
93
+
94
+ sequencer(clk.posedge,rst) do
95
+ res1 <= 0
96
+ hprint("$0 res1=",res1,"\n")
97
+ # sfor(buf) do |elem,idx|
98
+ # buf.seach.with_index do |elem,idx|
99
+ # res1 <= elem * elem
100
+ # hprint("$1 res1=",res1," idx=",idx,"\n")
101
+ # end
102
+ buf.seach do |elem|
103
+ res1 <= elem * elem
104
+ hprint("$1 elem=",elem," res1=",res1,"\n")
105
+ end
106
+ hprint("$2 res1=",res1,"\n")
107
+ end
108
+
109
+ [32].inner :res2
110
+
111
+ sequencer(clk.posedge,rst) do
112
+ res2 <= 0
113
+ hprint("%0 res2=",res2,"\n")
114
+ (0..7).seach do |elem|
115
+ res2 <= elem * elem
116
+ hprint("%1 elem=",elem," res2=",res2,"\n")
117
+ end
118
+ hprint("%2 res2=",res2,"\n")
119
+ end
120
+
121
+ [32].inner :res3
122
+
123
+ sequencer(clk.posedge,rst) do
124
+ res3 <= 0
125
+ hprint("&0 res3=",res3,"\n")
126
+ 5.supto(10).with_index do |elem,idx|
127
+ res3 <= [elem[15..0],idx[15..0]]
128
+ hprint("&1 elem=",elem," idx=",idx," res3=",res3,"\n")
129
+ end
130
+ hprint("&2 res3=",res3,"\n")
131
+ end
132
+
133
+ bit[8][-8].inner ar0: [_h01,_h02,_h04,_h08, _h10,_h20,_h40,_h80]
134
+ bit[8][-8].inner ar1: [_h01,_h02,_h03,_h04, _h05,_h06,_h07,_h08]
135
+ bit[8][-8].inner :res4
136
+
137
+ sequencer(clk.posedge,rst) do
138
+ sfor(ar0) do |elem,idx|
139
+ res4[idx] <= elem + ar1[idx]
140
+ end
141
+ hprint("res4=",res4,"\n")
142
+ end
143
+
144
+ [8].inner :res5
145
+
146
+ sequencer(clk.posedge,rst) do
147
+ res5 <= 0
148
+ hprint("(0 res5=",res5,"\n")
149
+ (ar0.seach + ar1).seach do |elem|
150
+ res5 <= elem
151
+ hprint("(1 res5=",res5,"\n")
152
+ end
153
+ hprint("(2 res5=",res5,"\n")
154
+ end
155
+
156
+
157
+ [32].inner :res6
158
+
159
+ sequencer(clk.posedge,rst) do
160
+ res6 <= 0
161
+ hprint(")0 res6=",res6,"\n")
162
+ 10.sdownto(1) do |elem|
163
+ res6 <= elem
164
+ hprint(")1 res6=",res6,"\n")
165
+ end
166
+ hprint(")2 res6=",res6,"\n")
167
+ end
168
+
169
+
170
+ timed do
171
+ clk <= 0
172
+ rst <= 0
173
+ !10.ns
174
+ clk <= 1
175
+ !10.ns
176
+ clk <= 0
177
+ rst <= 1
178
+ !10.ns
179
+ clk <= 1
180
+ !10.ns
181
+ clk <= 0
182
+ rst <= 0
183
+ !10.ns
184
+ clk <= 1
185
+ repeat(100) do
186
+ !10.ns
187
+ clk <= ~clk
188
+ end
189
+ end
190
+ end