HDLRuby 2.4.12 → 2.4.19

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/ruby
2
+ # Script for generating the vcd files.
3
+
4
+ # The configuration scenarii
5
+ $scenarii = [
6
+ [:_clk2_clk2, :register], # 0
7
+ [:_clk2_nclk2, :register], # 1
8
+ [:_clk2_clk3, :register], # 2
9
+ [:_clk3_clk2, :register], # 3
10
+ [:_clk2_clk2, :handshake], # 4
11
+ [:_clk2_nclk2, :handshake], # 5
12
+ [:_clk2_clk3, :handshake], # 6
13
+ [:_clk3_clk2, :handshake], # 7
14
+ [:clk2_clk2_clk2, :queue], # 8
15
+ [:clk2_clk2_nclk2, :queue], # 9
16
+ [:clk1_clk2_clk3, :queue], # 10
17
+ [:clk3_clk2_clk1, :queue], # 11
18
+ [:clk2_clk3_clk1, :queue], # 12
19
+ [:clk2_clk1_clk3, :queue], # 13
20
+ ]
21
+ $scenarii.each_with_index do |scenarii,i|
22
+ puts "scenario: [#{i}] #{scenarii}"
23
+ `bundle exec ../hdrcc.rb --verilog with_multi_channels.rb WithMultiChannelPaper.V#{i} #{i}`
24
+ end
@@ -3,23 +3,23 @@
3
3
 
4
4
  # The configuration scenarii
5
5
  $scenarii = [
6
- [:sync, :register], # 00
7
- [:sync, :handshake], # 01
8
- [:sync, :queue], # 02
9
- [:nsync, :register], # 03
10
- [:nsync, :handshake], # 04
11
- [:nsync, :queue], # 05
12
- [:async, :register], # 06
13
- [:async, :handshake], # 07
14
- [:async, :queue], # 08
15
- [:proco, :register], # 09
16
- [:proco, :handshake], # 10
17
- [:proco, :queue], # 11
18
- [:double,:register], # 12
19
- [:double,:handshake], # 13
20
- [:double,:queue] # 14
6
+ [:_clk2_clk2, :register], # 0
7
+ [:_clk2_nclk2, :register], # 1
8
+ [:_clk2_clk3, :register], # 2
9
+ [:_clk3_clk2, :register], # 3
10
+ [:_clk2_clk2, :handshake], # 4
11
+ [:_clk2_nclk2, :handshake], # 5
12
+ [:_clk2_clk3, :handshake], # 6
13
+ [:_clk3_clk2, :handshake], # 7
14
+ [:clk2_clk2_clk2, :queue], # 8
15
+ [:clk2_clk2_nclk2, :queue], # 9
16
+ [:clk1_clk2_clk3, :queue], # 10
17
+ [:clk3_clk2_clk1, :queue], # 11
18
+ [:clk2_clk3_clk1, :queue], # 12
19
+ [:clk2_clk1_clk3, :queue], # 13
21
20
  ]
22
- (0..11).each do |i|
21
+ $scenarii.each_with_index do |scenarii,i|
22
+ puts "scenario: [#{i}] #{scenarii}"
23
23
  `bundle exec ../hdrcc.rb -S --vcd with_multi_channels.rb WithMultiChannelPaper #{i}`
24
- `mv WithMultiChannelPaper/hruby_simulator.vcd WithMultiChannelPaper/#{i.to_s.to_s.rjust(2,"0")}_#{$scenarii[i][0]}_#{$scenarii[i][1]}.vcd`
24
+ `mv WithMultiChannelPaper/hruby_simulator.vcd WithMultiChannelPaper/#{i.to_s.to_s.rjust(2,"0")}_#{scenarii[0]}_#{scenarii[1]}.vcd`
25
25
  end
@@ -0,0 +1,245 @@
1
+ require 'std/channel.rb'
2
+ require 'std/connector.rb'
3
+
4
+ include HDLRuby::High::Std
5
+
6
+ # Sample for testing the connectors of channels.
7
+
8
+ # Channel describing a buffered queue storing data of +typ+ type of +depth+,
9
+ # synchronized through clk and reset on +rst+.
10
+ channel(:queue) do |typ,depth,clk,rst|
11
+ # The inner buffer of the queue.
12
+ typ[-depth].inner :buffer
13
+ # The read and write pointers.
14
+ [depth.width].inner :rptr, :wptr
15
+ # The read and write command signals.
16
+ inner :rreq, :wreq
17
+ # The read and write ack signals.
18
+ inner :rack, :wack
19
+ # The read/write data registers.
20
+ typ.inner :rdata, :wdata
21
+
22
+ # The flags telling of the channel is synchronized
23
+ inner :rsync, :wsync
24
+
25
+ # The process handling the decoupled access to the buffer.
26
+ par(clk.posedge) do
27
+ hif(rst) { rptr <= 0; wptr <= 0 }
28
+ helse do
29
+ hif(~rsync) do
30
+ hif (~rreq) { rack <= 0 }
31
+ hif(rreq & (~rack) & (rptr != wptr)) do
32
+ rdata <= buffer[rptr]
33
+ rptr <= (rptr + 1) % depth
34
+ rack <= 1
35
+ end
36
+ end
37
+
38
+ hif(~wsync) do
39
+ hif (~wreq) { wack <= 0 }
40
+ hif(wreq & (~wack) & (((wptr+1) % depth) != rptr)) do
41
+ buffer[wptr] <= wdata
42
+ wptr <= (wptr + 1) % depth
43
+ wack <= 1
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ reader_output :rreq, :rptr, :rsync
50
+ reader_input :rdata, :rack, :wptr, :buffer
51
+
52
+ # The read primitive.
53
+ reader do |blk,target|
54
+ if (cur_behavior.on_event?(clk.posedge,clk.negedge)) then
55
+ # Same clk event, synchrone case: perform a direct access.
56
+ # Now perform the access.
57
+ top_block.unshift do
58
+ rsync <= 1
59
+ rreq <= 0
60
+ end
61
+ seq do
62
+ hif(rptr != wptr) do
63
+ # target <= rdata
64
+ target <= buffer[rptr]
65
+ rptr <= (rptr + 1) % depth
66
+ blk.call if blk
67
+ end
68
+ end
69
+ else
70
+ # Different clk event, perform a decoupled access.
71
+ top_block.unshift do
72
+ rsync <= 0
73
+ rreq <= 0
74
+ end
75
+ par do
76
+ hif (~rack) { rreq <= 1 }
77
+ helsif(rreq) do
78
+ rreq <= 0
79
+ target <= rdata
80
+ blk.call if blk
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ writer_output :wreq, :wdata, :wptr, :wsync, :buffer
87
+ writer_input :wack, :rptr
88
+
89
+ # The write primitive.
90
+ writer do |blk,target|
91
+ if (cur_behavior.on_event?(clk.negedge,clk.posedge)) then
92
+ # Same clk event, synchrone case: perform a direct access.
93
+ top_block.unshift do
94
+ wsync <= 1
95
+ wreq <= 0
96
+ end
97
+ hif(((wptr+1) % depth) != rptr) do
98
+ buffer[wptr] <= target
99
+ wptr <= (wptr + 1) % depth
100
+ blk.call if blk
101
+ end
102
+ else
103
+ # Different clk event, asynchrone case: perform a decoupled access.
104
+ top_block.unshift do
105
+ wsync <= 0
106
+ wreq <= 0
107
+ end
108
+ seq do
109
+ hif (~wack) do
110
+ wreq <= 1
111
+ wdata <= target
112
+ end
113
+ helsif(wreq) do
114
+ wreq <= 0
115
+ blk.call if blk
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+
123
+
124
+
125
+ # Module for testing the connector.
126
+ system :with_connectors do
127
+ inner :clk, :rst
128
+
129
+ # First tester.
130
+ [4].inner :counter
131
+ [4*4].inner :res
132
+ inner :ack_in, :ack_out
133
+
134
+ # The input queue.
135
+ queue(bit[4],4,clk,rst).(:in_qu)
136
+
137
+ # The middle queues.
138
+ mid_qus = 4.times.map do |i|
139
+ queue(bit[4],4,clk,rst).(:"mid_qu#{i}")
140
+ end
141
+
142
+ # The output queue.
143
+ queue(bit[4*4],4,clk,rst).(:out_qu)
144
+
145
+ # Connect the input queue to the middle queues.
146
+ duplicator(bit[4],clk.negedge,in_qu,mid_qus)
147
+
148
+ # Connect the middle queues to the output queue.
149
+ merger([bit[4]]*4,clk.negedge,mid_qus,out_qu)
150
+
151
+
152
+ # Second tester.
153
+ [4].inner :counterb
154
+ [4].inner :resb
155
+ inner :ack_inb0, :ack_inb1, :ack_outb
156
+
157
+ # The input queues.
158
+ queue(bit[4],4,clk,rst).(:in_qub0)
159
+ queue(bit[4],4,clk,rst).(:in_qub1)
160
+
161
+ # The output queue.
162
+ queue(bit[4],4,clk,rst).(:out_qub)
163
+
164
+ # Connect then with a serializer.
165
+ serializer(bit[4],clk.negedge,[in_qub0,in_qub1],out_qub)
166
+
167
+ # # Slow version, always work
168
+ # par(clk.posedge) do
169
+ # ack_in <= 0
170
+ # ack_out <= 1
171
+ # hif(rst) { counter <= 0 }
172
+ # helse do
173
+ # hif(ack_out) do
174
+ # ack_out <= 0
175
+ # in_qu.write(counter) do
176
+ # ack_in <= 1
177
+ # counter <= counter + 1
178
+ # end
179
+ # end
180
+ # hif(ack_in) do
181
+ # mid_qu0.read(res_0)
182
+ # mid_qu1.read(res_1)
183
+ # mid_qu2.read(res_2)
184
+ # mid_qu3.read(res_3) { ack_out <= 1 }
185
+ # end
186
+ # end
187
+ # end
188
+
189
+ # Fast version but assumes connected channels are blocking
190
+ par(clk.posedge) do
191
+ ack_in <= 0
192
+ ack_inb0 <= 0
193
+ ack_inb1 <= 0
194
+ hif(rst) { counter <= 0; counterb <= 0 }
195
+ helse do
196
+ in_qu.write(counter) do
197
+ ack_in <= 1
198
+ counter <= counter + 1
199
+ end
200
+ hif(ack_in) do
201
+ out_qu.read(res)
202
+ end
203
+ hif(~ack_inb0) do
204
+ in_qub0.write(counterb) do
205
+ ack_inb0 <= 1
206
+ counterb <= counterb + 1
207
+ end
208
+ end
209
+ helse do
210
+ in_qub1.write(counterb) do
211
+ ack_inb1 <= 1
212
+ counterb <= counterb + 1
213
+ end
214
+ end
215
+ hif(ack_inb0 | ack_inb1) do
216
+ out_qub.read(resb)
217
+ end
218
+ end
219
+ end
220
+
221
+ timed do
222
+ clk <= 0
223
+ rst <= 0
224
+ !10.ns
225
+ clk <= 1
226
+ !10.ns
227
+ clk <= 0
228
+ rst <= 1
229
+ !10.ns
230
+ clk <= 1
231
+ !10.ns
232
+ clk <= 0
233
+ !10.ns
234
+ clk <= 1
235
+ !10.ns
236
+ clk <= 0
237
+ rst <= 0
238
+ 16.times do
239
+ !10.ns
240
+ clk <= 1
241
+ !10.ns
242
+ clk <= 0
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,98 @@
1
+ require 'std/memory.rb'
2
+ require "std/fixpoint.rb"
3
+ require 'std/channel.rb'
4
+ require 'std/connector.rb'
5
+
6
+ include HDLRuby::High::Std
7
+
8
+ system :channel_connector do
9
+ # データ型の宣言
10
+ integer_width = 4 # 整数部のビット幅
11
+ decimal_width = 4 # 実数部のビット幅
12
+ address_width = 4 # lutのアドレスのビット幅
13
+ typ = signed[integer_width + decimal_width] # データ型
14
+
15
+ inputs_x = _00010011
16
+ inputs_h = _10100001
17
+ columns = [2, 2, 1]
18
+
19
+ inner :clk, # clock
20
+ :rst, # reset
21
+ :req, # request
22
+ :fill # 入力値のメモリへの書き込み
23
+
24
+ # inputs_x = quantize(inputs_x, typ, decimal_width)
25
+ # inputs_h = quantize(inputs_h, typ, decimal_width)
26
+
27
+ mem_rom(typ, columns[0], clk, rst, inputs_x, rinc: :rst, winc: :rst).(:rom_inputs_x) # 入力値を格納するrom(x)
28
+
29
+ mem_rom(typ, columns[0], clk, rst, inputs_h, rinc: :rst, winc: :rst).(:rom_inputs_h) # 入力値を格納するrom(h)
30
+
31
+ mem_dual(typ, columns[0], clk, rst, rinc: :rst, winc: :rst).(:ram_inputs_serializer) #
32
+
33
+ mem_dual(typ, columns[0]*2, clk, rst, rinc: :rst, winc: :rst).(:ram_inputs_merger) #
34
+
35
+ reader_inputs_x = rom_inputs_x.branch(:rinc) #入力値xの読みだし用branch
36
+ reader_inputs_h = rom_inputs_h.branch(:rinc) #入力値hの読みだし用branch
37
+ writer_inputs_serializer = ram_inputs_serializer.branch(:winc) #入力値を合成した値の書き込み用branch
38
+ writer_inputs_meger = ram_inputs_merger.branch(:winc) #入力値を合成した値の書き込み用branch
39
+
40
+
41
+ serializer(typ,clk.negedge,[reader_inputs_x,reader_inputs_h],writer_inputs_serializer)
42
+
43
+ # merger([typ]*2,clk.negedge,[reader_inputs_x,reader_inputs_h], writer_inputs_meger)
44
+
45
+ # duplicator(typ,clk.negedge,reader_inputs_r,[])
46
+
47
+
48
+ timed do
49
+ # リセット
50
+ clk <= 0
51
+ rst <= 0
52
+ req <= 0
53
+ fill <= 0
54
+ !10.ps
55
+
56
+ # メモリ読み出し位置の初期化
57
+ rst <= 1
58
+ !10.ps
59
+ clk <= 1
60
+ !10.ps
61
+ clk <= 0
62
+ !10.ps
63
+ clk <= 1
64
+ !10.ps
65
+
66
+ # パラメータのメモリへの書き込み
67
+ clk <= 0
68
+ rst <= 0
69
+ fill <= 1
70
+
71
+ !10.ps
72
+ 10.times do |i|
73
+ clk <= 1
74
+ !10.ps
75
+ clk <= 0
76
+ !10.ps
77
+ end
78
+
79
+ fill <= 0
80
+ clk <= 1
81
+ !10.ps
82
+
83
+ # 計算の実行
84
+ clk <= 0
85
+ req <= 1
86
+ !10.ps
87
+ clk <= 1
88
+ !10.ps
89
+ clk <= 0
90
+ !10.ps
91
+ 30.times do
92
+ clk <= 1
93
+ !10.ps
94
+ clk <= 0
95
+ !10.ps
96
+ end
97
+ end
98
+ end
@@ -10,36 +10,41 @@ channel(:queue) do |typ,depth,clk,rst|
10
10
  # The read and write pointers.
11
11
  [depth.width].inner :rptr, :wptr
12
12
  # The read and write command signals.
13
- inner :rcmd, :wcmd
13
+ inner :rreq, :wreq
14
14
  # The read and write ack signals.
15
15
  inner :rack, :wack
16
- # The ack check deactivator (for synchron accesses).
17
- inner :hrack, :hwack
18
16
  # The read/write data registers.
19
17
  typ.inner :rdata, :wdata
20
18
 
19
+ # The flags telling of the channel is synchronized
20
+ inner :rsync, :wsync
21
+
21
22
  # The process handling the decoupled access to the buffer.
22
23
  par(clk.posedge) do
23
- # rack <= 0
24
- # wack <= 0
25
- hif (~rcmd) { rack <= 0 }
26
- hif (~wcmd) { wack <= 0 }
27
24
  hif(rst) { rptr <= 0; wptr <= 0 }
28
- hif(rcmd & (hrack|~rack) & (rptr != wptr)) do
29
- rptr <= (rptr + 1) % depth
30
- rack <= 1
31
- end
32
- hif(wcmd & (hwack|~wack) & (((wptr+1) % depth) != rptr)) do
33
- buffer[wptr] <= wdata
34
- # buffer[1] <= wdata
35
- wptr <= (wptr + 1) % depth
36
- wack <= 1
25
+ helse do
26
+ hif(~rsync) do
27
+ hif (~rreq) { rack <= 0 }
28
+ hif(rreq & (~rack) & (rptr != wptr)) do
29
+ rdata <= buffer[rptr]
30
+ rptr <= (rptr + 1) % depth
31
+ rack <= 1
32
+ end
33
+ end
34
+
35
+ hif(~wsync) do
36
+ hif (~wreq) { wack <= 0 }
37
+ hif(wreq & (~wack) & (((wptr+1) % depth) != rptr)) do
38
+ buffer[wptr] <= wdata
39
+ wptr <= (wptr + 1) % depth
40
+ wack <= 1
41
+ end
42
+ end
37
43
  end
38
44
  end
39
- par { rdata <= buffer[rptr] }
40
45
 
41
- reader_output :rcmd, :rptr, :hrack
42
- reader_input :rdata, :rack
46
+ reader_output :rreq, :rptr, :rsync
47
+ reader_input :rdata, :rack, :wptr, :buffer
43
48
 
44
49
  # The read primitive.
45
50
  reader do |blk,target|
@@ -47,66 +52,64 @@ channel(:queue) do |typ,depth,clk,rst|
47
52
  # Same clk event, synchrone case: perform a direct access.
48
53
  # Now perform the access.
49
54
  top_block.unshift do
50
- rcmd <= 0
51
- hrack <= 1
55
+ rsync <= 1
56
+ rreq <= 0
52
57
  end
53
58
  seq do
54
- rptr <= (rptr + 1) % depth
55
- target <= rdata
56
- blk.call if blk
59
+ hif(rptr != wptr) do
60
+ target <= buffer[rptr]
61
+ rptr <= (rptr + 1) % depth
62
+ blk.call if blk
63
+ end
57
64
  end
58
65
  else
59
66
  # Different clk event, perform a decoupled access.
60
67
  top_block.unshift do
61
- rcmd <= 0
62
- hrack <= 0
63
- hif(rack) do
64
- blk.call if blk
65
- end
68
+ rsync <= 0
69
+ rreq <= 0
66
70
  end
67
- seq do
68
- # hif(rack) do
69
- # blk.call if blk
70
- # end
71
- # helse do
72
- hif(rack==0) do
73
- rcmd <= 1
71
+ par do
72
+ hif (~rack) { rreq <= 1 }
73
+ helsif(rreq) do
74
+ rreq <= 0
74
75
  target <= rdata
76
+ blk.call if blk
75
77
  end
76
78
  end
77
79
  end
78
80
  end
79
81
 
80
- writer_output :wcmd, :wdata, :hwack
81
- writer_input :wack
82
+ writer_output :wreq, :wdata, :wptr, :wsync, :buffer
83
+ writer_input :wack, :rptr
82
84
 
83
85
  # The write primitive.
84
86
  writer do |blk,target|
85
87
  if (cur_behavior.on_event?(clk.negedge,clk.posedge)) then
86
88
  # Same clk event, synchrone case: perform a direct access.
87
89
  top_block.unshift do
88
- wcmd <= 0
89
- hwack <= 1
90
+ wsync <= 1
91
+ wreq <= 0
92
+ end
93
+ hif(((wptr+1) % depth) != rptr) do
94
+ buffer[wptr] <= target
95
+ wptr <= (wptr + 1) % depth
96
+ blk.call if blk
90
97
  end
91
- wcmd <= 1
92
- wdata <= target
93
- blk.call if blk
94
98
  else
95
99
  # Different clk event, asynchrone case: perform a decoupled access.
96
100
  top_block.unshift do
97
- wcmd <= 0
98
- hwack <= 0
99
- hif(wack) do
100
- blk.call if blk
101
- end
101
+ wsync <= 0
102
+ wreq <= 0
102
103
  end
103
104
  seq do
104
- # hif(wack) do
105
- # blk.call if blk
106
- # end
107
- # helse
108
- hif(wack==0) { wcmd <= 1 }
109
- wdata <= target
105
+ hif (~wack) do
106
+ wreq <= 1
107
+ wdata <= target
108
+ end
109
+ helsif(wreq) do
110
+ wreq <= 0
111
+ blk.call if blk
112
+ end
110
113
  end
111
114
  end
112
115
  end
@@ -181,82 +184,28 @@ channel(:handshake) do |typ|
181
184
  end
182
185
  end
183
186
 
184
- # Channel describing a handshake for transmitting data of +typ+ type, reset
185
- # by +rst+
186
- channel(:handshake2) do |typ|
187
- # The data signal.
188
- typ.inner :data
189
- # The request and acknowledge.
190
- inner :req, :ack
191
- # The write flag
192
- inner :wf
193
-
194
- reader_input :ack, :data
195
- reader_output :req
196
-
197
- # The read primitive.
198
- reader do |blk,target|
199
- top_block.unshift do
200
- req <= 0
201
- hif(ack & req == 1) do
202
- target <= data
203
- req <= 0
204
- blk.call if blk
205
- end
206
- end
207
- hif(ack == 0) do
208
- req <= 1
209
- end
210
- end
211
-
212
- writer_input :req
213
- writer_output :ack, :data
214
- writer_inout :wf
215
-
216
- # The read primitive.
217
- writer do |blk,target|
218
- top_block.unshift do
219
- ack <= 0
220
- hif(wf & req & ~ack == 1) do
221
- data <= target
222
- ack <= 1
223
- blk.call if blk
224
- end
225
- hif(~req) { wf <= 0 }
226
- end
227
- hif(~ack) do
228
- wf <= 1
229
- end
230
- end
231
- end
232
-
233
187
 
234
- # $mode = :sync
235
- # $mode = :nsync
236
- # $mode = :async
237
- # $mode = :proco # Producer / Consummer
238
- # $mode = :double # Producer and Consummer with double channels.
188
+ # $mode: channel clock, producer clock, consumer clock (n: not clock)
239
189
  # $channel = :register
240
190
  # $channel = :handshake
241
191
  # $channel = :queue
242
192
 
243
193
  # The configuration scenarii
244
194
  $scenarii = [
245
- [:sync, :register], # 0
246
- [:sync, :handshake], # 1
247
- [:sync, :queue], # 3
248
- [:nsync, :register], # 4
249
- [:nsync, :handshake], # 5
250
- [:nsync, :queue], # 6
251
- [:async, :register], # 7
252
- [:async, :handshake], # 8
253
- [:async, :queue], # 9
254
- [:proco, :register], # 10
255
- [:proco, :handshake], # 11
256
- [:proco, :queue], # 12
257
- [:double,:register], # 13
258
- [:double,:handshake], # 14
259
- [:double,:queue] # 15
195
+ [:_clk2_clk2, :register], # 0
196
+ [:_clk2_nclk2, :register], # 1
197
+ [:_clk2_clk3, :register], # 2
198
+ [:_clk3_clk2, :register], # 3
199
+ [:_clk2_clk2, :handshake], # 4
200
+ [:_clk2_nclk2, :handshake], # 5
201
+ [:_clk2_clk3, :handshake], # 6
202
+ [:_clk3_clk2, :handshake], # 7
203
+ [:clk2_clk2_clk2, :queue], # 8
204
+ [:clk2_clk2_nclk2, :queue], # 9
205
+ [:clk1_clk2_clk3, :queue], # 10
206
+ [:clk3_clk2_clk1, :queue], # 11
207
+ [:clk2_clk3_clk1, :queue], # 12
208
+ [:clk2_clk1_clk3, :queue], # 13
260
209
  ]
261
210
 
262
211
  # The configuration
@@ -266,113 +215,72 @@ puts "scenario: #{$scenarii[ARGV[-1].to_i]}"
266
215
 
267
216
  # Testing the queue channel.
268
217
  system :test_queue do
269
- inner :clk, :rst, :clk2, :clk3
218
+ inner :rst, :clk1, :clk2, :clk3
270
219
  [8].inner :idata, :odata, :odata2
271
220
  [4].inner :counter
272
221
 
222
+
223
+ # Assign the clocks
224
+ mode = $mode.to_s.split("_")
225
+ if ($channel == :queue) then
226
+ clk_que = send(mode[0])
227
+ end
228
+ ev_pro = mode[1][0] == "n" ?
229
+ send(mode[1][1..-1]).negedge : send(mode[1]).posedge
230
+ ev_con = mode[2][0] == "n" ?
231
+ send(mode[2][1..-1]).negedge : send(mode[2]).posedge
232
+
233
+ # Set up the channel
273
234
  if $channel == :register then
274
235
  register(bit[8]).(:my_ch)
275
- register(bit[8]).(:my_ch2)
276
236
  elsif $channel == :handshake then
277
237
  handshake(bit[8],rst).(:my_ch)
278
- handshake(bit[8],rst).(:my_ch2)
279
238
  elsif $channel == :queue then
280
- queue(bit[8],5,clk,rst).(:my_ch)
281
- queue(bit[8],5,clk,rst).(:my_ch2)
239
+ queue(bit[8],3,clk_que,rst).(:my_ch)
282
240
  end
283
241
 
284
- ev = $mode == :sync ? clk.posedge :
285
- $mode == :nsync ? clk.negedge : clk2.posedge
286
-
287
- if $mode != :proco && $mode != :double then
288
- # Sync/Neg sync and async tests mode
289
- par(ev) do
290
- hif(rst) do
291
- counter <= 0
292
- idata <= 0
293
- # odata <= 0
294
- end
295
- helse do
296
- hif (counter < 4) do
297
- my_ch.write(idata) do
298
- idata <= idata + 1
299
- counter <= counter + 1
300
- end
301
- end
302
- helsif ((counter > 10) & (counter < 15)) do
303
- my_ch.read(odata) do
304
- # idata <= idata - odata
305
- counter <= counter + 1
306
- end
307
- end
308
- helse do
309
- counter <= counter + 1
310
- end
311
- end
242
+ # Producter/consumer mode
243
+ # Producer
244
+ par(ev_pro) do
245
+ hif(rst) do
246
+ idata <= 0
312
247
  end
313
- elsif $mode == :proco then
314
- # Producter/consumer mode
315
- # Producer
316
- par(clk2.posedge) do
317
- hif(rst) do
318
- idata <= 0
319
- end
320
- helse do
321
- my_ch.write(idata) do
322
- idata <= idata + 1
323
- end
248
+ helse do
249
+ my_ch.write(idata) do
250
+ idata <= idata + 1
324
251
  end
325
252
  end
326
- # Consumer
327
- par(clk3.posedge) do
328
- hif(rst) do
329
- counter <= 0
330
- end
331
- helse do
332
- my_ch.read(odata) do
333
- counter <= counter + 1
334
- end
335
- end
253
+ end
254
+ # Consumer
255
+ par(ev_con) do
256
+ hif(rst) do
257
+ counter <= 0
336
258
  end
337
- else
338
- # Producer and consumer are commicating through two layers of channels
339
- par(ev) do
340
- hif(rst) do
341
- counter <= 0
342
- idata <= 0
343
- end
344
- helse do
345
- my_ch.write(idata) do
346
- idata <= idata + 1
347
- end
348
- my_ch.read(odata) do
349
- my_ch2.write(odata)
350
- end
351
- my_ch2.read(odata2) do
352
- counter <= counter + 1
353
- end
259
+ helse do
260
+ my_ch.read(odata) do
261
+ counter <= counter + 1
354
262
  end
355
263
  end
356
264
  end
357
265
 
358
266
  timed do
359
- clk <= 0
267
+ clk1 <= 0
360
268
  clk2 <= 0
361
269
  clk3 <= 0
362
270
  rst <= 0
363
271
  !10.ns
364
- clk <= 1
272
+ clk1 <= 1
365
273
  !10.ns
366
- clk <= 0
274
+ clk1 <= 0
367
275
  rst <= 1
368
276
  !3.ns
369
277
  clk2 <= 1
370
278
  !3.ns
371
279
  clk3 <= 0
372
280
  !4.ns
373
- clk <= 1
281
+ clk1 <= 1
374
282
  !10.ns
375
- clk <= 0
283
+ clk1 <= 0
376
284
  !3.ns
377
285
  clk2 <= 0
378
286
  !3.ns
@@ -381,9 +289,9 @@ system :test_queue do
381
289
  rst <= 0
382
290
  !2.ns
383
291
  64.times do
384
- clk <= 1
292
+ clk1 <= 1
385
293
  !10.ns
386
- clk <= 0
294
+ clk1 <= 0
387
295
  !3.ns
388
296
  clk2 <= ~clk2
389
297
  !3.ns