Refactor readback mux implementation. Improves performance (#155) and eliminates illegal streaming operator usage (#165)
This commit is contained in:
@@ -38,18 +38,15 @@ This section also assigns any hardware interface outputs.
|
||||
|
||||
Readback
|
||||
--------
|
||||
The readback layer aggregates and reduces all readable registers into a single
|
||||
read response. During a read operation, the same address decode strobes are used
|
||||
to select the active register that is being accessed.
|
||||
This allows for a simple OR-reduction operation to be used to compute the read
|
||||
data response.
|
||||
The readback layer aggregates and MUXes all readable registers into a single
|
||||
read response.
|
||||
|
||||
For designs with a large number of software-readable registers, an optional
|
||||
fanin re-timing stage can be enabled. This stage is automatically inserted at a
|
||||
balanced point in the read-data reduction so that fanin and logic-levels are
|
||||
optimally reduced.
|
||||
|
||||
.. figure:: diagrams/readback.png
|
||||
.. figure:: diagrams/rt-readback-fanin.png
|
||||
:width: 65%
|
||||
:align: center
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
Holy smokes this is complicated
|
||||
|
||||
Keep this exporter in Alpha/Beta for a while
|
||||
Add some text in the readme or somewhere:
|
||||
- No guarantees of correctness! This is always true with open source software,
|
||||
but even more here!
|
||||
Be sure to do your own validation before using this in production.
|
||||
- Alpha means the implementation may change drastically!
|
||||
Unlike official sem-ver, I am not making any guarantees on compatibility
|
||||
- I need your help! Validating, finding edge cases, etc...
|
||||
@@ -1,35 +1,84 @@
|
||||
--------------------------------------------------------------------------------
|
||||
Readback mux layer
|
||||
--------------------------------------------------------------------------------
|
||||
Use a large always_comb block + many if statements that select the read data
|
||||
based on the cpuif address.
|
||||
Loops are handled the same way as address decode.
|
||||
|
||||
Implementation:
|
||||
- Big always_comb block
|
||||
- Initialize default rd_data value
|
||||
- Lotsa if statements that operate on reg strb to assign rd_data
|
||||
- Merges all fields together into reg
|
||||
- pulls value from storage element struct, or input struct
|
||||
- Provision for optional flop stage?
|
||||
Other options that were considered:
|
||||
- Flat case statement
|
||||
con: Difficult to represent arrays. Essentially requires unrolling
|
||||
con: complicates retiming strategies
|
||||
con: Representing a range (required for externals) is cumbersome. Possible with stacked casez wildcards.
|
||||
- AND field data with strobe, then massive OR reduce
|
||||
This was the strategy prior to v1.3, but turned out to infer more overhead
|
||||
than originally anticipated
|
||||
- Assigning data to a flat register array, then directly indexing via address
|
||||
con: Would work fine, but scales poorly for sparse regblocks.
|
||||
Namely, simulators would likely allocate memory for the entire array
|
||||
- Assign to a flat array that is packed sequentially, then directly indexing using a derived packed index
|
||||
Concern that for sparse regfiles, the translation of addr --> packed index
|
||||
becomes a nontrivial logic function
|
||||
|
||||
Mux Strategy:
|
||||
Flat case statement:
|
||||
-- Cant parameterize
|
||||
+ better performance?
|
||||
Pros:
|
||||
- Scales well for arrays since loops can be used
|
||||
- Externals work well, as address ranges can be compared
|
||||
- Synthesis results show more efficient logic inference
|
||||
|
||||
Flat 1-hot array then OR reduce:
|
||||
- Create a bus-wide flat array
|
||||
eg: 32-bits x N readable registers
|
||||
- Assign each element:
|
||||
the readback value of each register
|
||||
... masked by the register's access strobe
|
||||
- I could also stuff an extra bit into the array that denotes the read is valid
|
||||
A missed read will OR reduce down to a 0
|
||||
- Finally, OR reduce all the elements in the array down to a flat 32-bit bus
|
||||
- Retiming the large OR fanin can be done by chopping up the array into stages
|
||||
for 2 stages, sqrt(N) gives each stage's fanin size. Round to favor
|
||||
more fanin on 2nd stage
|
||||
3 stages uses cube-root. etc...
|
||||
- This has the benefit of re-using the address decode logic.
|
||||
synth can choose to replicate logic if fanout is bad
|
||||
Example:
|
||||
logic [7:0] out;
|
||||
always_comb begin
|
||||
out = '0;
|
||||
for(int i=0; i<64; i++) begin
|
||||
if(i == addr) out = data[i];
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
How to implement retiming:
|
||||
Ideally this would partition the design into several equal sub-regions, but
|
||||
with loop structures, this is pretty difficult..
|
||||
What if instead, it is partitioned into equal address ranges?
|
||||
|
||||
First stage compares the lower-half of the address bits.
|
||||
Values are assigned to the appropriate output "bin"
|
||||
|
||||
logic [7:0] out[8];
|
||||
always_comb begin
|
||||
for(int i=0; i<8; i++) out[i] = '0;
|
||||
|
||||
for(int i=0; i<64; i++) begin
|
||||
automatic bit [5:0] this_addr = i;
|
||||
|
||||
if(this_addr[2:0] == addr[2:0]) out[this_addr[5:3]] = data[i];
|
||||
end
|
||||
end
|
||||
|
||||
(not showing retiming ff for `out` and `addr`)
|
||||
The second stage muxes down the resulting bins using the high address bits.
|
||||
If the user up-sizes the address bits, need to check the upper bits to prevent aliasing
|
||||
Assuming min address bit range is [5:0], but it was padded up to [8:0], do the following:
|
||||
|
||||
logic [7:0] rd_data;
|
||||
always_comb begin
|
||||
if(addr[8:6] != '0) begin
|
||||
// Invalid read range
|
||||
rd_data = '0;
|
||||
end else begin
|
||||
rd_data = out[addr[5:3]];
|
||||
end
|
||||
end
|
||||
|
||||
Retiming with external blocks
|
||||
One minor downside is the above scheme does not work well for external blocks
|
||||
that span a range of addresses. Depending on the range, it may span multiple
|
||||
retiming bins which complicates how this would be assigned cleanly.
|
||||
This would be complicated even further with arrays of externals since the
|
||||
span of bins could change depending on the iteration.
|
||||
|
||||
Since externals can already be retimed, and large fanin of external blocks
|
||||
is likely less of a concern, implement these as a separate readback mux on
|
||||
the side that does not get retimed at all.
|
||||
|
||||
|
||||
WARNING:
|
||||
@@ -42,8 +91,14 @@ WARNING:
|
||||
|
||||
Forwards response strobe back up to cpu interface layer
|
||||
|
||||
TODO:
|
||||
Dont forget about alias registers here
|
||||
|
||||
TODO:
|
||||
Does the endinness the user sets matter anywhere?
|
||||
Variables:
|
||||
From decode:
|
||||
decoded_addr
|
||||
decoded_req
|
||||
decoded_req_is_wr
|
||||
|
||||
Response:
|
||||
readback_done
|
||||
readback_err
|
||||
readback_data
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 89 KiB |
242
docs/diagrams/rt-readback-fanin.drawio
Normal file
242
docs/diagrams/rt-readback-fanin.drawio
Normal file
@@ -0,0 +1,242 @@
|
||||
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.0.3 Chrome/140.0.7339.249 Electron/38.7.0 Safari/537.36" version="29.0.3">
|
||||
<diagram name="Page-1" id="2eHshj4V_V3cOmKikpwH">
|
||||
<mxGraphModel dx="542" dy="940" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-1" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="570" as="sourcePoint" />
|
||||
<mxPoint x="400" y="570" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-2" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=10.009999999999991;" vertex="1" parent="1">
|
||||
<mxGeometry x="369.98" y="590.03" width="80.01" height="19.98" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-3" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="590" as="sourcePoint" />
|
||||
<mxPoint x="400" y="590" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-4" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="610.02" as="sourcePoint" />
|
||||
<mxPoint x="400" y="610.02" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-5" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="630" as="sourcePoint" />
|
||||
<mxPoint x="400" y="630" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-8" value="&lt;reg1&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="560" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-9" value="&lt;reg2&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="580" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-10" value="&lt;reg3&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="600" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-11" value="&lt;reg4&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="620" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-12" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="660" as="sourcePoint" />
|
||||
<mxPoint x="400" y="660" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-13" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=10.009999999999991;" vertex="1" parent="1">
|
||||
<mxGeometry x="369.98" y="680.03" width="80.01" height="19.98" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-14" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="680" as="sourcePoint" />
|
||||
<mxPoint x="400" y="680" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-15" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="700.02" as="sourcePoint" />
|
||||
<mxPoint x="400" y="700.02" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-16" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="720" as="sourcePoint" />
|
||||
<mxPoint x="400" y="720" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-17" value="&lt;reg5&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="650" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-18" value="&lt;reg6&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="670" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-19" value="&lt;reg7&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="690" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-20" value="&lt;reg8&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="710" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-21" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="750" as="sourcePoint" />
|
||||
<mxPoint x="400" y="750" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-22" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=10.009999999999991;" vertex="1" parent="1">
|
||||
<mxGeometry x="369.98" y="770.03" width="80.01" height="19.98" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-23" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="770" as="sourcePoint" />
|
||||
<mxPoint x="400" y="770" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-24" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="790.02" as="sourcePoint" />
|
||||
<mxPoint x="400" y="790.02" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-25" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="810" as="sourcePoint" />
|
||||
<mxPoint x="400" y="810" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-26" value="&lt;reg9&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="740" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-27" value="&lt;reg10&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="760" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-28" value="&lt;reg11&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="780" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-29" value="&lt;reg12&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="800" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-30" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="840" as="sourcePoint" />
|
||||
<mxPoint x="400" y="840" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-31" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=10.009999999999991;" vertex="1" parent="1">
|
||||
<mxGeometry x="369.98" y="860.03" width="80.01" height="19.98" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-32" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="860" as="sourcePoint" />
|
||||
<mxPoint x="400" y="860" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-33" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="880.02" as="sourcePoint" />
|
||||
<mxPoint x="400" y="880.02" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-34" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="900" as="sourcePoint" />
|
||||
<mxPoint x="400" y="900" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-35" value="&lt;reg13&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="830" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-36" value="&lt;reg14&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="850" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-37" value="&lt;reg15&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="870" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-38" value="&lt;reg16&gt;" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="890" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-42" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="eVcFmWNxBADlTckHnpvW-2">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="490" y="700" as="sourcePoint" />
|
||||
<mxPoint x="520" y="700" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="490" y="600" />
|
||||
<mxPoint x="490" y="700" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-43" value="" style="shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;rotation=90;size=10.009999999999991;" vertex="1" parent="1">
|
||||
<mxGeometry x="490" y="720.02" width="80.01" height="19.98" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-44" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="420" y="690" as="sourcePoint" />
|
||||
<mxPoint x="520" y="720" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="480" y="690" />
|
||||
<mxPoint x="480" y="720" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-45" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="420" y="780" as="sourcePoint" />
|
||||
<mxPoint x="520" y="740" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="480" y="780" />
|
||||
<mxPoint x="480" y="740" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-46" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="420" y="870" as="sourcePoint" />
|
||||
<mxPoint x="520" y="760" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="490" y="870" />
|
||||
<mxPoint x="490" y="760" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-47" value="" style="endArrow=classic;html=1;rounded=0;" edge="1" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="540" y="729.84" as="sourcePoint" />
|
||||
<mxPoint x="560" y="730" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-48" value="if retime_read_fanin = True" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="369.98" y="920" width="160" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-49" value="addr" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="290" y="510" width="50" height="20" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-50" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="eVcFmWNxBADlTckHnpvW-2">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="340" y="519.66" as="sourcePoint" />
|
||||
<mxPoint x="400" y="519.66" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="410" y="520" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-51" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="eVcFmWNxBADlTckHnpvW-43">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="410" y="520" as="sourcePoint" />
|
||||
<mxPoint x="530" y="565" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="530" y="520" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="eVcFmWNxBADlTckHnpvW-40" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
|
||||
<mxGeometry x="440" y="500" width="20" height="420" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
docs/diagrams/rt-readback-fanin.png
Normal file
BIN
docs/diagrams/rt-readback-fanin.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
Reference in New Issue
Block a user