HDLRuby 2.4.19 → 2.4.20

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: 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