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 +4 -4
- data/lib/HDLRuby/hdr_samples/with_connector.rb +10 -1
- data/lib/HDLRuby/std/connector.rb +22 -3
- data/lib/HDLRuby/std/memory.rb +121 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd6292fe897c939784b2d10ae3e69e69eec7149be02fbc077b9ae789af840825
|
4
|
+
data.tar.gz: cd3ead86ae5b63976cab3d45db537f60a984ca65b0355dadaa755d1b6cbe0b89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
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
|
-
|
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
|
data/lib/HDLRuby/std/memory.rb
CHANGED
@@ -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
|
data/lib/HDLRuby/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2020-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|