HDLRuby 2.4.19 → 2.4.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98f251acca7748335f7f60586eddb75a2b8efb9773225d3776bdb585b6d05060
4
- data.tar.gz: 689f2d3b0c2332e2877c3dcfd273b43c3b7deb44853f21aeffdd2e60d7e1d74c
3
+ metadata.gz: fd6292fe897c939784b2d10ae3e69e69eec7149be02fbc077b9ae789af840825
4
+ data.tar.gz: cd3ead86ae5b63976cab3d45db537f60a984ca65b0355dadaa755d1b6cbe0b89
5
5
  SHA512:
6
- metadata.gz: 3732704b0a83a69ccf1796772c25d70a453adf5b0d4d795d2c9741fdb2e6e9ba5b086348983012a6ff68415de2327e22e7a7eed6bdff647da98e37406410869a
7
- data.tar.gz: b01e94018fb612dfae8cbce2076a19829fe44f9301a5f4969d153323981b889c8b9d434ffc4b6f91e27830c312ef1108decc28c275be7a65997d74123488480d
6
+ metadata.gz: 7d33e055f706df8d06d6bd7578002a399c695f5a6705fce523a033a8d9954a74b44e1a337ac851a49a68a0c8d5a3fe42326a26b5d92003bb7d17dc90f5ed27a8
7
+ data.tar.gz: 8f49e18b9dbfd2ce0a5676e558c6054258809876f610ec3e35eda8ad4bf18ba9834aa11c6229ceb5e75b42649a353603da854a57b9f72432dc0b6459b1e35d61
@@ -130,6 +130,7 @@ system :with_connectors do
130
130
  [4].inner :counter
131
131
  [4*4].inner :res
132
132
  inner :ack_in, :ack_out
133
+ inner :dup_req, :dup_ack
133
134
 
134
135
  # The input queue.
135
136
  queue(bit[4],4,clk,rst).(:in_qu)
@@ -143,7 +144,7 @@ system :with_connectors do
143
144
  queue(bit[4*4],4,clk,rst).(:out_qu)
144
145
 
145
146
  # Connect the input queue to the middle queues.
146
- duplicator(bit[4],clk.negedge,in_qu,mid_qus)
147
+ duplicator(bit[4],clk.negedge,in_qu,mid_qus,dup_req,dup_ack)
147
148
 
148
149
  # Connect the middle queues to the output queue.
149
150
  merger([bit[4]]*4,clk.negedge,mid_qus,out_qu)
@@ -221,6 +222,7 @@ system :with_connectors do
221
222
  timed do
222
223
  clk <= 0
223
224
  rst <= 0
225
+ dup_req <= 0
224
226
  !10.ns
225
227
  clk <= 1
226
228
  !10.ns
@@ -235,6 +237,13 @@ system :with_connectors do
235
237
  !10.ns
236
238
  clk <= 0
237
239
  rst <= 0
240
+ 4.times do
241
+ !10.ns
242
+ clk <= 1
243
+ !10.ns
244
+ clk <= 0
245
+ end
246
+ dup_req <= 1
238
247
  16.times do
239
248
  !10.ns
240
249
  clk <= 1
@@ -9,13 +9,28 @@ module HDLRuby::High::Std
9
9
  # channel +in_ch+ and connect it to channels +out_chs+ with data of
10
10
  # +typ+.
11
11
  # The duplication is done according to event +ev+.
12
- function :duplicator do |typ, ev, in_ch, out_chs|
12
+ # The optional req and ack arguments are the signals for controlling the
13
+ # duplicator using a handshake protocol. If set to nil, the duplicator
14
+ # runs automatically.
15
+ function :duplicator do |typ, ev, in_ch, out_chs, req = nil, ack = nil|
13
16
  ev = ev.poswedge unless ev.is_a?(Event)
14
- inner :in_ack, :in_req
17
+ inner :in_ack
18
+ inner :in_req
15
19
  out_acks = out_chs.size.times.map { |i| inner(:"out_ack#{i}") }
16
20
  typ.inner :data
17
21
  par(ev) do
18
- in_req <= 1
22
+ if (ack) then
23
+ # Output ack mode.
24
+ ack <= 0
25
+ end
26
+ if (req) then
27
+ # Input request mode.
28
+ in_req <= 0
29
+ hif(req) { in_req <= 1 }
30
+ else
31
+ # Automatic mode.
32
+ in_req <= 1
33
+ end
19
34
  out_acks.each { |ack| ack <= 0 }
20
35
  out_acks.each do |ack|
21
36
  hif(ack == 1) { in_req <= 0 }
@@ -30,6 +45,10 @@ module HDLRuby::High::Std
30
45
  end
31
46
  hif (out_acks.reduce(_1) { |sum,ack| ack & sum }) do
32
47
  out_acks.each { |ack| ack <= 0 }
48
+ if (ack) then
49
+ # Output ack mode.
50
+ ack <= 1
51
+ end
33
52
  end
34
53
  end
35
54
  end
@@ -1704,6 +1704,127 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1704
1704
 
1705
1705
  end
1706
1706
 
1707
+
1708
+ # Queue memory of +size+ elements of +typ+ typ, syncrhonized on +clk+
1709
+ # (positive and negative edges) and reset on +rst+.
1710
+ # At each rising edge of +clk+ a read and a write is guaranteed to be
1711
+ # completed provided they are triggered.
1712
+ #
1713
+ # NOTE: this channel does not have any branch.
1714
+ HDLRuby::High::Std.channel(:mem_queue) do |typ,size,clk,rst|
1715
+ # The inner buffer of the queue.
1716
+ typ[-size].inner :buffer
1717
+ # The read and write pointers.
1718
+ [size.width].inner :rptr, :wptr
1719
+ # The read and write command signals.
1720
+ inner :rreq, :wreq
1721
+ # The read and write ack signals.
1722
+ inner :rack, :wack
1723
+ # The read/write data registers.
1724
+ typ.inner :rdata, :wdata
1725
+
1726
+ # The flags telling of the channel is synchronized
1727
+ inner :rsync, :wsync
1728
+
1729
+ # The process handling the decoupled access to the buffer.
1730
+ par(clk.posedge) do
1731
+ hif(rst) { rptr <= 0; wptr <= 0 }
1732
+ helse do
1733
+ hif(~rsync) do
1734
+ hif (~rreq) { rack <= 0 }
1735
+ hif(rreq & (~rack) & (rptr != wptr)) do
1736
+ rdata <= buffer[rptr]
1737
+ rptr <= (rptr + 1) % depth
1738
+ rack <= 1
1739
+ end
1740
+ end
1741
+
1742
+ hif(~wsync) do
1743
+ hif (~wreq) { wack <= 0 }
1744
+ hif(wreq & (~wack) & (((wptr+1) % size) != rptr)) do
1745
+ buffer[wptr] <= wdata
1746
+ wptr <= (wptr + 1) % size
1747
+ wack <= 1
1748
+ end
1749
+ end
1750
+ end
1751
+ end
1752
+
1753
+ reader_output :rreq, :rptr, :rsync
1754
+ reader_input :rdata, :rack, :wptr, :buffer
1755
+
1756
+ # The read primitive.
1757
+ reader do |blk,target|
1758
+ if (cur_behavior.on_event?(clk.posedge,clk.negedge)) then
1759
+ # Same clk event, synchrone case: perform a direct access.
1760
+ # Now perform the access.
1761
+ top_block.unshift do
1762
+ rsync <= 1
1763
+ rreq <= 0
1764
+ end
1765
+ seq do
1766
+ hif(rptr != wptr) do
1767
+ # target <= rdata
1768
+ target <= buffer[rptr]
1769
+ rptr <= (rptr + 1) % size
1770
+ blk.call if blk
1771
+ end
1772
+ end
1773
+ else
1774
+ # Different clk event, perform a decoupled access.
1775
+ top_block.unshift do
1776
+ rsync <= 0
1777
+ rreq <= 0
1778
+ end
1779
+ par do
1780
+ hif (~rack) { rreq <= 1 }
1781
+ helsif(rreq) do
1782
+ rreq <= 0
1783
+ target <= rdata
1784
+ blk.call if blk
1785
+ end
1786
+ end
1787
+ end
1788
+ end
1789
+
1790
+ writer_output :wreq, :wdata, :wptr, :wsync, :buffer
1791
+ writer_input :wack, :rptr
1792
+
1793
+ # The write primitive.
1794
+ writer do |blk,target|
1795
+ if (cur_behavior.on_event?(clk.negedge,clk.posedge)) then
1796
+ # Same clk event, synchrone case: perform a direct access.
1797
+ top_block.unshift do
1798
+ wsync <= 1
1799
+ wreq <= 0
1800
+ end
1801
+ hif(((wptr+1) % size) != rptr) do
1802
+ buffer[wptr] <= target
1803
+ wptr <= (wptr + 1) % size
1804
+ blk.call if blk
1805
+ end
1806
+ else
1807
+ # Different clk event, asynchrone case: perform a decoupled access.
1808
+ top_block.unshift do
1809
+ wsync <= 0
1810
+ wreq <= 0
1811
+ end
1812
+ seq do
1813
+ hif (~wack) do
1814
+ wreq <= 1
1815
+ wdata <= target
1816
+ end
1817
+ helsif(wreq) do
1818
+ wreq <= 0
1819
+ blk.call if blk
1820
+ end
1821
+ end
1822
+ end
1823
+ end
1824
+ end
1825
+
1826
+
1827
+
1707
1828
  # HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1708
1829
  # # Ensure typ is a type.
1709
1830
  # typ = typ.to_type
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.4.19"
2
+ VERSION = "2.4.20"
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.4.19
4
+ version: 2.4.20
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-12-06 00:00:00.000000000 Z
11
+ date: 2020-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler