Merge remote-tracking branch 'origin/master' into ganesh_dev
|
@ -1,3 +1,3 @@
|
|||
*.gds filter=lfs diff=lfs merge=lfs -text
|
||||
*.spef filter=lfs diff=lfs merge=lfs -text
|
||||
TESTBENCH/**/*.v filter=lfs diff=lfs merge=lfs -text
|
||||
TESTBENCH/*/pnr/verilog_testbench/*_tb.v filter=lfs diff=lfs merge=lfs -text
|
||||
|
|
|
@ -26,6 +26,7 @@ sudo apt-get install libxft-dev
|
|||
sudo apt-get install libxml++2.6-dev
|
||||
sudo apt-get install perl
|
||||
sudo apt-get install python
|
||||
sudo apt-get install python3-setuptools
|
||||
sudo apt-get install python-lxml
|
||||
sudo apt-get install texinfo
|
||||
sudo apt-get install time
|
||||
|
@ -46,3 +47,5 @@ sudo apt-get install g++-9
|
|||
sudo apt-get install gcc-9
|
||||
sudo apt-get install clang-6.0
|
||||
sudo apt-get install clang-8
|
||||
# Python dependencies
|
||||
python3 -m pip install -r /home/runner/work/SOFA/SOFA/OpenFPGA/requirements.txt
|
||||
|
|
|
@ -103,7 +103,8 @@
|
|||
10e-12
|
||||
</delay_matrix>
|
||||
</circuit_model>
|
||||
<circuit_model type="pass_gate" name="TGATE" prefix="TGATE" is_default="true">
|
||||
<!-- Trick OpenFPGA to avoid auto-generating TGATE modules, which are not used in PnR -->
|
||||
<circuit_model type="pass_gate" name="TGATE" prefix="TGATE" is_default="true" verilog_netlist="${SKYWATER_OPENFPGA_HOME}/HDL/common/fd_hd_mux_custom_cells_tt.v">
|
||||
<design_technology type="cmos" topology="transmission_gate" nmos_size="1" pmos_size="2"/>
|
||||
<device_technology device_model_name="logic"/>
|
||||
<input_buffer exist="false"/>
|
||||
|
@ -288,7 +289,7 @@
|
|||
</direct_connection>
|
||||
<tile_annotations>
|
||||
<global_port name="clk" tile_port="clb.clk" is_clock="true" default_val="0"/>
|
||||
<global_port name="reset" tile_port="clb.reset" is_reset="true" default_val="1"/>
|
||||
<global_port name="Reset" tile_port="clb.reset" is_reset="true" default_val="1"/>
|
||||
</tile_annotations>
|
||||
<pb_type_annotations>
|
||||
<!-- physical pb_type binding in complex block IO -->
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#recommonmark
|
||||
|
||||
#Handle references in bibtex format
|
||||
sphinxcontrib-bibtex
|
||||
sphinxcontrib-bibtex<2.0.0
|
||||
sphinxcontrib-tikz
|
||||
|
||||
#Work-around bug "AttributeError: 'Values' object has no attribute 'character_level_inline_markup'" with docutils 0.13.1
|
||||
|
|
|
@ -7,3 +7,5 @@
|
|||
sofa_hd/index
|
||||
|
||||
qlsofa_hd/index
|
||||
|
||||
sofa_chd/index
|
||||
|
|
|
@ -1,253 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="628.9111 1022.3935 418.46777 349.9947" width="418.46777" height="349.9947">
|
||||
<defs>
|
||||
<font-face font-family="Times" font-size="16" panose-1="0 0 5 0 0 0 0 9 0 0" units-per-em="1000" underline-position="-75.68359" underline-thickness="49.316406" slope="-937.5" x-height="446.28906" cap-height="652.34375" ascent="750" descent="-250" font-style="italic" font-weight="400">
|
||||
<font-face-src>
|
||||
<font-face-name name="Times-Italic"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<font-face font-family="Times" font-size="16" panose-1="0 0 8 0 0 0 0 9 0 0" units-per-em="1000" underline-position="-66.40625" underline-thickness="67.87109" slope="-937.5" x-height="462.8906" cap-height="668.9453" ascent="750" descent="-250" font-style="italic" font-weight="700">
|
||||
<font-face-src>
|
||||
<font-face-name name="Times-BoldItalic"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -4 10 8" markerWidth="10" markerHeight="8" color="#7f8080">
|
||||
<g>
|
||||
<path d="M 8 0 L 0 -3 L 0 3 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/>
|
||||
</g>
|
||||
</marker>
|
||||
<marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker_2" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-9 -4 10 8" markerWidth="10" markerHeight="8" color="#7f8080">
|
||||
<g>
|
||||
<path d="M -8 0 L 0 3 L 0 -3 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/>
|
||||
</g>
|
||||
</marker>
|
||||
<font-face font-family="Times New Roman" font-size="13" panose-1="2 2 8 3 7 5 5 2 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="95.21484" slope="0" x-height="456.54297" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-weight="700">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-BoldMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
</defs>
|
||||
<metadata> Produced by OmniGraffle 7.18\n2020-11-19 23:01:04 +0000</metadata>
|
||||
<g id="switch" fill="none" stroke="none" stroke-opacity="1" stroke-dasharray="none" fill-opacity="1">
|
||||
<title>switch</title>
|
||||
<g id="switch_boundary">
|
||||
<title>boundary</title>
|
||||
<g id="Graphic_567">
|
||||
<rect x="744.75" y="1083.375" width="210.375" height="232.875" fill="#ffff80"/>
|
||||
<path d="M 955.125 1083.375 L 744.75 1083.375 L 744.75 1316.25 L 955.125 1316.25 Z" stroke="gray" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.0,4.0" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_568">
|
||||
<line x1="955.125" y1="1235.206" x2="923.7813" y2="1235.9262" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_569">
|
||||
<path d="M 859.332 1083 L 859.332 1101.6667 L 886.389 1101.4805" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_570">
|
||||
<text transform="translate(829.418 1059.375)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">CCFF_IN</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_571">
|
||||
<line x1="937.694" y1="1107.1693" x2="955.1471" y2="1107" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_572">
|
||||
<text transform="translate(961.4805 1096.0833)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">CCFF_OUT</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_573">
|
||||
<line x1="744.75" y1="1022.8935" x2="744.75" y2="1324" stroke="#7f8080" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_574">
|
||||
<text transform="translate(756.29 1027.8935)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="700" fill="black" x="0" y="15">FPGA Fabric</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_575">
|
||||
<text transform="translate(642.9111 1027.8935)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="700" fill="black" x="0" y="15">SoC Interface</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_576">
|
||||
<line x1="963.5113" y1="1050.1534" x2="639.311" y2="1051.8419" marker-end="url(#FilledArrow_Marker)" marker-start="url(#FilledArrow_Marker_2)" stroke="#7f8080" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="switch_base">
|
||||
<title>base</title>
|
||||
<g id="Graphic_514">
|
||||
<text transform="translate(684.168 1226.7952)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">SOC_IN</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_515">
|
||||
<text transform="translate(670.8359 1277.3506)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">SOC_OUT</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_517">
|
||||
<line x1="892.0556" y1="1236.2952" x2="743.3945" y2="1236.2952" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_518">
|
||||
<line x1="795.4195" y1="1203.125" x2="795.4195" y2="1277.7382" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_519">
|
||||
<line x1="907.753" y1="1203.0717" x2="907.7329" y2="1226.9284" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_522">
|
||||
<line x1="956.4805" y1="1287.1037" x2="811.0889" y2="1287.1088" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_523">
|
||||
<text transform="translate(961.4805 1277.602)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">FPGA_OUT</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_524">
|
||||
<text transform="translate(960.125 1224.8457)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">FPGA_IN</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_542">
|
||||
<ellipse cx="795.4195" cy="1199.125" rx="2.53125404468923" ry="3.00000479370559" fill="black"/>
|
||||
<ellipse cx="795.4195" cy="1199.125" rx="2.53125404468923" ry="3.00000479370559" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_543">
|
||||
<line x1="743.3945" y1="1199.675" x2="904.2251" y2="1199.0847" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_544">
|
||||
<text transform="translate(673.5117 1190.3125)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">SOC_DIR</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_545">
|
||||
<ellipse cx="907.7563" cy="1199.0717" rx="2.53125404468911" ry="3.00000479370553" fill="black"/>
|
||||
<ellipse cx="907.7563" cy="1199.0717" rx="2.53125404468911" ry="3.00000479370553" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_552">
|
||||
<g id="Graphic_556">
|
||||
<path d="M 907.8607 1148.8333 L 907.8607 1156.8333 C 909.8607 1176.8333 915.8607 1178.8333 927.8607 1188.8333 C 939.8607 1178.8333 945.8607 1176.8333 947.8607 1156.8333 L 947.8607 1148.8333 C 939.8607 1150.8333 938.8607 1151.8333 927.8607 1152.8333 C 916.8607 1151.8333 915.8607 1150.8333 907.8607 1148.8333" fill="white"/>
|
||||
<path d="M 907.8607 1148.8333 L 907.8607 1156.8333 C 909.8607 1176.8333 915.8607 1178.8333 927.8607 1188.8333 C 939.8607 1178.8333 945.8607 1176.8333 947.8607 1156.8333 L 947.8607 1148.8333 C 939.8607 1150.8333 938.8607 1151.8333 927.8607 1152.8333 C 916.8607 1151.8333 915.8607 1150.8333 907.8607 1148.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_555">
|
||||
<line x1="937.8607" y1="1138.8333" x2="937.8607" y2="1150.3333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_554">
|
||||
<line x1="917.8607" y1="1138.8333" x2="917.8607" y2="1148.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_553">
|
||||
<line x1="927.8607" y1="1187.541" x2="927.8607" y2="1198.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_558">
|
||||
<rect x="887.002" y="1091.0833" width="29.338917" height="32.89894" fill="white"/>
|
||||
<rect x="887.002" y="1091.0833" width="29.338917" height="32.89894" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(892.002 1099.7567)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="13" font-weight="700" fill="black" x="1.7285404" y="12">FF</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_557">
|
||||
<path d="M 886.944 1112.6843 L 895.7246 1115.9805 L 886.944 1119.2767 Z" fill="#ccc"/>
|
||||
<path d="M 886.944 1112.6843 L 895.7246 1115.9805 L 886.944 1119.2767 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_559">
|
||||
<line x1="743.3945" y1="1116.7604" x2="886.944" y2="1116.0036" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_560">
|
||||
<text transform="translate(657.4961 1107.5)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">PROG_CLK</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_561">
|
||||
<path d="M 917.341 1107.3747 L 937.694 1107.1693 L 937.8607 1138.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_562">
|
||||
<line x1="740.5195" y1="1138.8849" x2="917.341" y2="1138.25" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_563">
|
||||
<text transform="translate(658.1836 1129.5417)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">IO_ISOL_N</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_564">
|
||||
<line x1="909.2875" y1="1199.0536" x2="927.8607" y2="1198.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_565">
|
||||
<line x1="778.791" y1="1287.0613" x2="746.0703" y2="1286.9666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_583">
|
||||
<path d="M 950.625 1109.5817 L 950.625 1103.8796 L 950.625 1103.8796 L 950.625 1101.0285 L 961.0859 1106.7306 L 950.625 1112.4328 L 950.625 1109.5817 Z" fill="#c0ffff"/>
|
||||
<path d="M 950.625 1109.5817 L 950.625 1103.8796 L 950.625 1103.8796 L 950.625 1101.0285 L 961.0859 1106.7306 L 950.625 1112.4328 L 950.625 1109.5817 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_582">
|
||||
<path d="M 950.625 1237.0586 L 950.625 1231.3565 L 950.625 1231.3565 L 950.625 1228.5054 L 961.0859 1234.2075 L 950.625 1239.9097 L 950.625 1237.0586 Z" fill="#c0ffff"/>
|
||||
<path d="M 950.625 1237.0586 L 950.625 1231.3565 L 950.625 1231.3565 L 950.625 1228.5054 L 961.0859 1234.2075 L 950.625 1239.9097 L 950.625 1237.0586 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_581">
|
||||
<path d="M 957.7109 1289.815 L 957.7109 1284.1128 L 957.7109 1284.1128 L 957.7109 1281.2617 L 947.25 1286.9639 L 957.7109 1292.666 L 957.7109 1289.815 Z" fill="#ff8080"/>
|
||||
<path d="M 957.7109 1289.815 L 957.7109 1284.1128 L 957.7109 1284.1128 L 957.7109 1281.2617 L 947.25 1286.9639 L 957.7109 1292.666 L 957.7109 1289.815 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_584">
|
||||
<path d="M 856.313 1078.2217 L 862.0151 1078.2217 L 862.0151 1078.2217 L 864.8662 1078.2217 L 859.1641 1088.6826 L 853.4619 1078.2217 L 856.313 1078.2217 Z" fill="#c0ffff"/>
|
||||
<path d="M 856.313 1078.2217 L 862.0151 1078.2217 L 862.0151 1078.2217 L 864.8662 1078.2217 L 859.1641 1088.6826 L 853.4619 1078.2217 L 856.313 1078.2217 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_585">
|
||||
<path d="M 740.0195 1119.8511 L 740.0195 1114.1489 L 740.0195 1114.1489 L 740.0195 1111.2979 L 750.4805 1117 L 740.0195 1122.7021 L 740.0195 1119.8511 Z" fill="#c0ffff"/>
|
||||
<path d="M 740.0195 1119.8511 L 740.0195 1114.1489 L 740.0195 1114.1489 L 740.0195 1111.2979 L 750.4805 1117 L 740.0195 1122.7021 L 740.0195 1119.8511 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_586">
|
||||
<path d="M 740.0195 1141.8927 L 740.0195 1136.1906 L 740.0195 1136.1906 L 740.0195 1133.3395 L 750.4805 1139.0417 L 740.0195 1144.7438 L 740.0195 1141.8927 Z" fill="#c0ffff"/>
|
||||
<path d="M 740.0195 1141.8927 L 740.0195 1136.1906 L 740.0195 1136.1906 L 740.0195 1133.3395 L 750.4805 1139.0417 L 740.0195 1144.7438 L 740.0195 1141.8927 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_587">
|
||||
<path d="M 742.0195 1239.1968 L 742.0195 1233.4946 L 742.0195 1233.4946 L 742.0195 1230.6436 L 752.4805 1236.3457 L 742.0195 1242.0479 L 742.0195 1239.1968 Z" fill="#c0ffff"/>
|
||||
<path d="M 742.0195 1239.1968 L 742.0195 1233.4946 L 742.0195 1233.4946 L 742.0195 1230.6436 L 752.4805 1236.3457 L 742.0195 1242.0479 L 742.0195 1239.1968 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_588">
|
||||
<path d="M 750.4805 1201.9761 L 750.4805 1196.2739 L 750.4805 1196.2739 L 750.4805 1193.4229 L 740.0195 1199.125 L 750.4805 1204.8271 L 750.4805 1201.9761 Z" fill="#ff8080"/>
|
||||
<path d="M 750.4805 1201.9761 L 750.4805 1196.2739 L 750.4805 1196.2739 L 750.4805 1193.4229 L 740.0195 1199.125 L 750.4805 1204.8271 L 750.4805 1201.9761 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_589">
|
||||
<path d="M 750.4805 1289.815 L 750.4805 1284.1128 L 750.4805 1284.1128 L 750.4805 1281.2617 L 740.0195 1286.9639 L 750.4805 1292.666 L 750.4805 1289.815 Z" fill="#ff8080"/>
|
||||
<path d="M 750.4805 1289.815 L 750.4805 1284.1128 L 750.4805 1284.1128 L 750.4805 1281.2617 L 740.0195 1286.9639 L 750.4805 1292.666 L 750.4805 1289.815 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_590">
|
||||
<path d="M 869.7197 1360.7393 L 869.7197 1355.0371 L 869.7197 1355.0371 L 869.7197 1352.186 L 859.2588 1357.8882 L 869.7197 1363.5903 L 869.7197 1360.7393 Z" fill="#ff8080"/>
|
||||
<path d="M 869.7197 1360.7393 L 869.7197 1355.0371 L 869.7197 1355.0371 L 869.7197 1352.186 L 859.2588 1357.8882 L 869.7197 1363.5903 L 869.7197 1360.7393 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_591">
|
||||
<text transform="translate(882.4463 1348.25)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">output pin</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_593">
|
||||
<text transform="translate(762.583 1348.3882)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">input pin</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_592">
|
||||
<path d="M 744.75 1360.601 L 744.75 1354.899 L 744.75 1354.899 L 744.75 1352.0479 L 755.2109 1357.75 L 744.75 1363.4521 L 744.75 1360.601 Z" fill="#c0ffff"/>
|
||||
<path d="M 744.75 1360.601 L 744.75 1354.899 L 744.75 1354.899 L 744.75 1352.0479 L 755.2109 1357.75 L 744.75 1363.4521 L 744.75 1360.601 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_595">
|
||||
<path d="M 893.0556 1219.8457 L 922.3945 1236.2952 L 893.0556 1252.7446 Z" fill="white"/>
|
||||
<path d="M 893.0556 1219.8457 L 922.3945 1236.2952 L 893.0556 1252.7446 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_597">
|
||||
<path d="M 810.0889 1270.6599 L 780.75 1287.1094 L 810.0889 1303.5588 Z" fill="white"/>
|
||||
<path d="M 810.0889 1270.6599 L 780.75 1287.1094 L 810.0889 1303.5588 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_600">
|
||||
<ellipse cx="937.4107" cy="1107.5328" rx="2.53125404468917" ry="3.00000479370565" fill="black"/>
|
||||
<ellipse cx="937.4107" cy="1107.5328" rx="2.53125404468917" ry="3.00000479370565" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_602">
|
||||
<circle cx="795.4195" cy="1275.1599" r="4.50000719055851" fill="white"/>
|
||||
<circle cx="795.4195" cy="1275.1599" r="4.50000719055851" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_603">
|
||||
<circle cx="917.8945" cy="1146.375" r="4.50000719055851" fill="white"/>
|
||||
<circle cx="917.8945" cy="1146.375" r="4.50000719055851" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 18 KiB |
|
@ -1,320 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="23.467723 118.41154 683.4357 506.50814" width="683.4357" height="506.50814">
|
||||
<defs>
|
||||
<font-face font-family="Times New Roman" font-size="26" panose-1="2 2 8 3 7 5 5 2 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="95.21484" slope="0" x-height="456.54297" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-weight="700">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-BoldMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -3 7 6" markerWidth="7" markerHeight="6" color="black">
|
||||
<g>
|
||||
<path d="M 4.8 0 L 0 -1.8 L 0 1.8 Z" fill="none" stroke="currentColor" stroke-width="1"/>
|
||||
</g>
|
||||
</marker>
|
||||
<font-face font-family="Times New Roman" font-size="16" panose-1="2 2 7 3 6 5 5 9 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="95.21484" slope="-1020.812" x-height="438.96484" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-style="italic" font-weight="700">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-BoldItalicMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<font-face font-family="Times New Roman" font-size="16" panose-1="2 2 8 3 7 5 5 2 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="95.21484" slope="0" x-height="456.54297" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-weight="700">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-BoldMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker_2" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -3 7 6" markerWidth="7" markerHeight="6" color="#ff2600">
|
||||
<g>
|
||||
<path d="M 4.8 0 L 0 -1.8 L 0 1.8 Z" fill="none" stroke="currentColor" stroke-width="1"/>
|
||||
</g>
|
||||
</marker>
|
||||
<marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Arrow_Marker_3" stroke-linejoin="miter" stroke-miterlimit="10" viewBox="-1 -3 7 6" markerWidth="7" markerHeight="6" color="#ff2600">
|
||||
<g>
|
||||
<path d="M 4.8 0 L 0 -1.8 L 0 1.8 Z" fill="none" stroke="currentColor" stroke-width="1"/>
|
||||
</g>
|
||||
</marker>
|
||||
</defs>
|
||||
<metadata> Produced by OmniGraffle 7.18\n2020-11-17 17:11:00 +0000</metadata>
|
||||
<g id="fpga_arch" fill="none" stroke="none" stroke-opacity="1" stroke-dasharray="none" fill-opacity="1">
|
||||
<title>fpga_arch</title>
|
||||
<g id="fpga_arch_legend">
|
||||
<title>legend</title>
|
||||
<g id="Graphic_2945">
|
||||
<rect x="123.1162" y="150.12" width="493.92" height="447.12" fill="#ccc"/>
|
||||
<rect x="123.1162" y="150.12" width="493.92" height="447.12" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2946">
|
||||
<text transform="translate(116.94136 118.41154)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="26" font-weight="700" fill="black" x="0" y="23">FPGA</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2947">
|
||||
<line x1="109.44" y1="612.32" x2="204.68613" y2="612.32" marker-end="url(#Arrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2948">
|
||||
<text transform="translate(226.76 602.24)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="black" x="0" y="14">x</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2949">
|
||||
<line x1="109.44" y1="611.32" x2="109.44" y2="512.9" marker-end="url(#Arrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2950">
|
||||
<text transform="translate(106.38922 476.3203)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="black" x="0" y="14">y</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
<g id="fpga_arch_chain">
|
||||
<title>chain</title>
|
||||
<g id="Graphic_2895">
|
||||
<rect x="136.8" y="171.51984" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="136.8" y="171.51984" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(141.8 187.24023)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="8.614643" y="31.679688">[1][12]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2897">
|
||||
<line x1="106.38179" y1="204.91992" x2="122.9" y2="204.91992" marker-end="url(#Arrow_Marker_2)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2898">
|
||||
<text transform="translate(28.467723 196.08007)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">SC_HEAD</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2902">
|
||||
<rect x="136.8" y="265.68" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="136.8" y="265.68" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(141.8 281.4004)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="9.056049" y="31.679688">[1][11]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2901">
|
||||
<line x1="173.0709" y1="239.32" x2="173.0709" y2="251.78" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2903">
|
||||
<line x1="173.57886" y1="333.48015" x2="173.80953" y2="349.1014" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2904">
|
||||
<text transform="translate(165.07089 364.84015)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2908">
|
||||
<rect x="136.8" y="425.2398" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="136.8" y="425.2398" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(141.8 440.9602)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="12.614643" y="31.679688">[1][2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2907">
|
||||
<line x1="173" y1="392.4" x2="173.02027" y2="411.33983" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2906">
|
||||
<rect x="136.8" y="519.4" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="136.8" y="519.4" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(141.8 535.1204)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="12.614643" y="31.679688">[1][1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2905">
|
||||
<line x1="173.0709" y1="493.04" x2="173.0709" y2="505.5" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2918">
|
||||
<rect x="239.76" y="171.51984" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="239.76" y="171.51984" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(244.76 187.24023)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="8.614643" y="31.679688">[2][12]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2917">
|
||||
<line x1="313.30178" y1="204.40795" x2="330.1012" y2="204.17718" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2916">
|
||||
<rect x="239.76" y="265.68" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="239.76" y="265.68" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(244.76 281.4004)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="9.056049" y="31.679688">[2][11]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2915">
|
||||
<line x1="276.0309" y1="264.68" x2="276.0309" y2="252.22" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2914">
|
||||
<line x1="276.96" y1="362" x2="276.72933" y2="346.37874" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2913">
|
||||
<text transform="translate(268.0309 364.84015)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2912">
|
||||
<rect x="239.76" y="425.2398" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="239.76" y="425.2398" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(244.76 440.9602)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="12.614643" y="31.679688">[2][2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2911">
|
||||
<line x1="275.99407" y1="424.23983" x2="275.9738" y2="405.3" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2910">
|
||||
<rect x="239.76" y="519.4" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="239.76" y="519.4" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(244.76 535.1204)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="12.614643" y="31.679688">[2][1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2909">
|
||||
<line x1="276.0309" y1="518.4" x2="276.0309" y2="505.94" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2919">
|
||||
<line x1="210.34178" y1="552.80006" x2="225.86" y2="552.80006" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2940">
|
||||
<rect x="422.96" y="171.51984" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="422.96" y="171.51984" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(427.96 187.24023)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="5.0560493" y="31.679688">[11][12]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2939">
|
||||
<line x1="384.48" y1="205" x2="409.06" y2="204.97367" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2938">
|
||||
<rect x="422.96" y="265.68" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="422.96" y="265.68" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(427.96 281.4004)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="5.4974556" y="31.679688">[11][11]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2937">
|
||||
<line x1="459.2309" y1="239.32" x2="459.2309" y2="251.78" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2936">
|
||||
<line x1="459.73884" y1="333.48015" x2="459.9695" y2="349.1014" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2935">
|
||||
<text transform="translate(451.2309 364.84015)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2934">
|
||||
<rect x="422.96" y="425.2398" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="422.96" y="425.2398" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(427.96 440.9602)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="9.056049" y="31.679688">[11][2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2933">
|
||||
<line x1="459.16" y1="392.4" x2="459.18025" y2="411.33983" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2932">
|
||||
<rect x="422.96" y="519.4" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="422.96" y="519.4" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(427.96 535.1204)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="9.056049" y="31.679688">[11][1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2931">
|
||||
<line x1="459.2309" y1="493.04" x2="459.2309" y2="505.5" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2930">
|
||||
<rect x="525.92" y="171.51984" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="525.92" y="171.51984" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(530.92 187.24023)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="4.614643" y="31.679688">[12][12]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2929">
|
||||
<line x1="599.46176" y1="204.91992" x2="620.8706" y2="204.91992" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2928">
|
||||
<rect x="525.92" y="265.68" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="525.92" y="265.68" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(530.92 281.4004)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="5.0560493" y="31.679688">[12][11]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2927">
|
||||
<line x1="562.1909" y1="264.68" x2="562.1909" y2="252.22" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2926">
|
||||
<line x1="563.12" y1="362" x2="562.8893" y2="346.37874" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2925">
|
||||
<text transform="translate(554.1909 364.84015)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2924">
|
||||
<rect x="525.92" y="425.2398" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="525.92" y="425.2398" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(530.92 440.9602)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="8.614643" y="31.679688">[12][2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2923">
|
||||
<line x1="562.15406" y1="424.23983" x2="562.1338" y2="405.3" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2922">
|
||||
<rect x="525.92" y="519.4" width="72.54179" height="66.800154" fill="#005cff"/>
|
||||
<rect x="525.92" y="519.4" width="72.54179" height="66.800154" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<text transform="translate(530.92 535.1204)" fill="white">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="14.821674" y="14">CLB</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="16" font-weight="700" fill="white" x="8.614643" y="31.679688">[12][1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_2921">
|
||||
<line x1="562.1909" y1="518.4" x2="562.1909" y2="505.94" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_2920">
|
||||
<line x1="496.50177" y1="552.80006" x2="512.02" y2="552.80006" marker-end="url(#Arrow_Marker_3)" stroke="#ff2600" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_2941">
|
||||
<text transform="translate(355.64 196.08007)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2942">
|
||||
<text transform="translate(638.7706 196.08007)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">SC_TAIL</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2951">
|
||||
<text transform="translate(355.64 364.84015)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2952">
|
||||
<text transform="translate(355.64 295.16)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2953">
|
||||
<text transform="translate(355.64 449.80006)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_2955">
|
||||
<text transform="translate(355.64 543.9602)" fill="#ff2600">
|
||||
<tspan font-family="Times New Roman" font-size="16" font-style="italic" font-weight="700" fill="#ff2600" x="0" y="14">…</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 72 KiB |
|
@ -1,4 +1,4 @@
|
|||
.. _datasheet_sofa_hd:
|
||||
.. _datasheet_qlsofa_hd:
|
||||
QLSOFA HD
|
||||
|
||||
QLSOFA HD
|
||||
|
|
|
@ -8,29 +8,14 @@ Circuit Designs
|
|||
I/O Circuit
|
||||
^^^^^^^^^^^
|
||||
|
||||
As shown in :numref:`fig_qlsofa_hd_embedded_io_schematic`, the I/O circuit used in the I/O tiles of the FPGA fabric (see :numref:`fig_qlsofa_hd_fpga_arch`) is an digital I/O cell with
|
||||
QLSOFA HD FPGA share the same I/O circuit design as SOFA HD FPGA.
|
||||
See details at :ref:`sofa_hd_circuit_design_io`.
|
||||
|
||||
- An **active-low** I/O isolation signal ``IO_ISOL_N`` to set the I/O in input mode. This is to avoid any unexpected output signals to damage circuits outside the FPGA due to configurable memories are not properly initialized.
|
||||
.. _sofa_hd_circuit_design_mux:
|
||||
|
||||
.. warning:: This feature may not be needed if the configurable memory cell has a built-in set/reset functionality!
|
||||
Multiplexer
|
||||
^^^^^^^^^^^
|
||||
|
||||
- An internal protection circuitry to ensure clean signals at all the SOC I/O ports. This is to avoid
|
||||
|
||||
- ``SOC_OUT`` port outputs any random signal when the I/O is in input mode
|
||||
- ``FPGA_IN`` port is driven by any random signal when the I/O is output mode
|
||||
QLSOFA HD FPGA share the same multiplexer design as SOFA HD FPGA.
|
||||
See details at :ref:`sofa_hd_circuit_design_mux`.
|
||||
|
||||
- An internal configurable memory element to control the direction of I/O cell
|
||||
|
||||
The truth table of the I/O cell is consistent with the GPIO cell of Caravel SoC, where
|
||||
|
||||
- When configuration bit (FF output) is logic ``1``, the I/O cell is in input mode
|
||||
|
||||
- When configuration bit (FF output) is logic ``0``, the I/O cell is in output mode
|
||||
|
||||
.. _fig_qlsofa_hd_embedded_io_schematic:
|
||||
|
||||
.. figure:: ./figures/qlsofa_hd_embedded_io_schematic.svg
|
||||
:scale: 30%
|
||||
:alt: Schematic of embedded I/O cell used in FPGA
|
||||
|
||||
Schematic of embedded I/O cell used in FPGA
|
||||
|
|
|
@ -8,21 +8,8 @@ Architecture
|
|||
Floorplan
|
||||
^^^^^^^^^
|
||||
|
||||
|
||||
:numref:`fig_qlsofa_hd_fpga_arch` shows an overview on the architecture of the embedded FPGA fabric.
|
||||
The FPGA follows a homogeneous architecture which only contains single type of tiles in the center fabric.
|
||||
I/O tiles are placed at the boundary of the FPGA to interface with GPIOs and RISC-V processors (see details in :ref:`qlsofa_hd_io_resource`).
|
||||
|
||||
.. _fig_qlsofa_hd_fpga_arch:
|
||||
|
||||
.. figure:: ./figures/qlsofa_hd_fpga_arch.svg
|
||||
:scale: 25%
|
||||
:alt: Tile-based FPGA architecture
|
||||
|
||||
Tile-based FPGA architecture
|
||||
|
||||
|
||||
.. _qlsofa_hd_fpga_arch_tiles:
|
||||
QLSOFA HD FPGA share the same floroplan as SOFA HD FPGA.
|
||||
See details at :ref:`sofa_hd_fpga_arch_floorplan`.
|
||||
|
||||
Tiles
|
||||
^^^^^
|
||||
|
@ -64,19 +51,5 @@ The FPGA architecture follows a tile-based organization, to exploit the fine-gra
|
|||
Scan-chain
|
||||
^^^^^^^^^^
|
||||
|
||||
There is a built-in scan-chain in the FPGA which connects the the `sc_in` and `sc_out` ports of CLBs in a chain (see details in :ref:`qlsofa_hd_clb_arch_scan_chain`), as illustrated in :numref:`fig_qlsofa_hd_fabric_scan_chain`.
|
||||
|
||||
When `Test_en` signal is active, users can
|
||||
|
||||
- overwrite the contents of all the D-type flip-flops in the FPGA by feeding signals to the `SC_HEAD` port
|
||||
- readback the contents of all the D-type flip-flops in the FPGA through the `SC_TAIL` port.
|
||||
|
||||
.. _fig_qlsofa_hd_fabric_scan_chain:
|
||||
|
||||
.. figure:: ./figures/qlsofa_hd_fabric_scan_chain.svg
|
||||
:scale: 25%
|
||||
:alt: Built-in scan-chain across FPGA
|
||||
|
||||
Built-in scan-chain across FPGA
|
||||
|
||||
|
||||
QLSOFA HD FPGA share the same floroplan as SOFA HD FPGA.
|
||||
See details at :ref:`sofa_hd_fpga_arch_scan_chain`.
|
||||
|
|
|
@ -6,7 +6,7 @@ I/O Resources
|
|||
Pin Assignment
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
The *High-Density* (HD) FPGA IP has 144 data I/O pins as shown in :numref:`fig_qlsofa_hd_fpga_io_switch`.
|
||||
The QLSOFA HD FPGA IP has 144 data I/O pins as shown in :numref:`fig_qlsofa_hd_fpga_io_switch`.
|
||||
|
||||
Among the 144 I/Os,
|
||||
|
||||
|
@ -26,14 +26,14 @@ Among the 144 I/Os,
|
|||
:scale: 20%
|
||||
:alt: I/O arrangement of FPGA IP
|
||||
|
||||
I/O arrangement of *High-Density* (HD) FPGA IP: switchable between logic analyzer and wishbone bus interface
|
||||
I/O arrangement of QLSOFA HD FPGA IP: switchable between logic analyzer and wishbone bus interface
|
||||
|
||||
.. _io_resource_qlsofa_hd_external_io:
|
||||
|
||||
External I/Os
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
A SOFA HD FPGA IP contains 37 external I/O pins, including 27 data I/Os and 10 control I/Os.
|
||||
A QLSOFA HD FPGA IP contains 37 external I/O pins, including 27 data I/Os and 10 control I/Os.
|
||||
|
||||
Full details are summarized in the following table.
|
||||
|
||||
|
|
|
@ -0,0 +1,433 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xl="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="282.01068 206.41353 146.11353 275.02845" width="146.11353" height="275.02845">
|
||||
<defs>
|
||||
<font-face font-family="Times New Roman" font-size="10" panose-1="2 2 5 3 5 4 5 9 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="48.828125" slope="-1633.2993" x-height="430.1758" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-style="italic" font-weight="400">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-ItalicMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<font-face font-family="Times New Roman" font-size="8" panose-1="2 2 5 3 5 4 5 9 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="48.828125" slope="-2041.624" x-height="430.1758" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-style="italic" font-weight="400">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-ItalicMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<font-face font-family="Times New Roman" font-size="6" panose-1="2 2 5 3 5 4 5 9 3 4" units-per-em="1000" underline-position="-108.88672" underline-thickness="48.828125" slope="-2722.1654" x-height="430.1758" cap-height="662.1094" ascent="891.1133" descent="-216.3086" font-style="italic" font-weight="400">
|
||||
<font-face-src>
|
||||
<font-face-name name="TimesNewRomanPS-ItalicMT"/>
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
</defs>
|
||||
<metadata> Produced by OmniGraffle 7.18\n2020-12-10 00:31:01 +0000</metadata>
|
||||
<g id="Canvas_2" stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
|
||||
<title>MUX3</title>
|
||||
<rect fill="white" x="282.01068" y="206.41353" width="146.11353" height="275.02845"/>
|
||||
<g id="Canvas_2_Layer_1">
|
||||
<title>Layer 1</title>
|
||||
<g id="Graphic_34701">
|
||||
<rect x="345.33387" y="206.91353" width="57.072266" height="274.02845" fill="#ffffc0"/>
|
||||
<path d="M 345.33387 206.91353 L 402.40613 206.91353 L 402.40613 480.942 L 345.33387 480.942 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.0,4.0" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Group_34696">
|
||||
<g id="Line_34699">
|
||||
<path d="M 358.091 328.34014 L 364.83956 328.34014 L 364.83956 320.72476 L 378.33666 320.72476 L 378.33666 328.34014 L 385.0852 328.34014" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34698">
|
||||
<line x1="371.5881" y1="316.70552" x2="371.5881" y2="309.09014" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34697">
|
||||
<line x1="364.83956" y1="316.70552" x2="378.33666" y2="316.70552" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34695"/>
|
||||
<g id="Graphic_34694">
|
||||
<text transform="translate(282.01068 432.19295)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">in[2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34693">
|
||||
<text transform="translate(328.0576 462.0445)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="8" font-style="italic" font-weight="400" fill="black" x="0" y="7">GND</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34692">
|
||||
<line x1="313.32696" y1="450.92776" x2="313.32696" y2="438.05996" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34691">
|
||||
<line x1="304.84506" y1="438.0595" x2="313.32696" y2="437.8905" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34685">
|
||||
<g id="Group_34687">
|
||||
<g id="Line_34690">
|
||||
<path d="M 336.07696 437.3095 L 336.07696 431.71575 L 327.07696 431.71575 L 327.07696 420.52826 L 336.07696 420.52826 L 336.07696 414.9345" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34689">
|
||||
<line x1="322.32696" y1="426.122" x2="313.32696" y2="426.122" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34688">
|
||||
<line x1="322.32696" y1="431.71575" x2="322.32696" y2="420.52826" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34686">
|
||||
<ellipse cx="320.07696" cy="425.5102" rx="2.00000319580378" ry="2.50000399475474" fill="white"/>
|
||||
<ellipse cx="320.07696" cy="425.5102" rx="2.00000319580378" ry="2.50000399475474" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34681">
|
||||
<g id="Line_34684">
|
||||
<path d="M 336.07696 462.11526 L 336.07696 456.5215 L 327.07696 456.5215 L 327.07696 445.334 L 336.07696 445.334 L 336.07696 439.74026" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34683">
|
||||
<line x1="322.32696" y1="450.92776" x2="313.32696" y2="450.92776" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34682">
|
||||
<line x1="322.32696" y1="456.5215" x2="322.32696" y2="445.334" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_34680">
|
||||
<line x1="313.32696" y1="426.122" x2="313.32696" y2="450.92776" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34676">
|
||||
<g id="Line_34679">
|
||||
<line x1="330.19617" y1="448.4145" x2="330.2579" y2="453.33576" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34678">
|
||||
<line x1="330.41657" y1="450.7618" x2="336.28078" y2="450.6806" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34677">
|
||||
<path d="M 336.03078 451.42627 L 336.03078 456.47393 L 332.44403 456.42666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34672">
|
||||
<g id="Line_34675">
|
||||
<line x1="330.94617" y1="423.6495" x2="330.9909" y2="428.8999" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34674">
|
||||
<line x1="331.10588" y1="425.9909" x2="336.28078" y2="425.9909" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34673">
|
||||
<path d="M 336.28078 425.72264 L 336.28078 420.89794 L 333.6818 420.8405" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34671">
|
||||
<text transform="translate(329.11572 399.45016)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">V</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="6" font-style="italic" font-weight="400" fill="black" y="9">DD</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34670">
|
||||
<line x1="336.0915" y1="438.401" x2="347.3415" y2="438.4412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_34669">
|
||||
<text transform="translate(282.01068 327.5606)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">in[1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34668">
|
||||
<text transform="translate(326.05 358.5445)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="8" font-style="italic" font-weight="400" fill="black" x="0" y="7">GND</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34667">
|
||||
<line x1="311.31934" y1="347.42776" x2="311.31934" y2="334.55996" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34666">
|
||||
<line x1="302.83744" y1="334.5595" x2="311.31934" y2="334.3905" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34660">
|
||||
<g id="Group_34662">
|
||||
<g id="Line_34665">
|
||||
<path d="M 334.06934 333.8095 L 334.06934 328.21575 L 325.06934 328.21575 L 325.06934 317.02826 L 334.06934 317.02826 L 334.06934 311.4345" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34664">
|
||||
<line x1="320.31934" y1="322.622" x2="311.31934" y2="322.622" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34663">
|
||||
<line x1="320.31934" y1="328.21575" x2="320.31934" y2="317.02826" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34661">
|
||||
<ellipse cx="318.06934" cy="322.0102" rx="2.00000319580381" ry="2.50000399475474" fill="white"/>
|
||||
<ellipse cx="318.06934" cy="322.0102" rx="2.00000319580381" ry="2.50000399475474" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34656">
|
||||
<g id="Line_34659">
|
||||
<path d="M 334.06934 358.61526 L 334.06934 353.0215 L 325.06934 353.0215 L 325.06934 341.834 L 334.06934 341.834 L 334.06934 336.24026" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34658">
|
||||
<line x1="320.31934" y1="347.42776" x2="311.31934" y2="347.42776" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34657">
|
||||
<line x1="320.31934" y1="353.0215" x2="320.31934" y2="341.834" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_34655">
|
||||
<line x1="311.31934" y1="322.622" x2="311.31934" y2="347.42776" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34651">
|
||||
<g id="Line_34654">
|
||||
<line x1="328.18855" y1="344.9145" x2="328.25027" y2="349.83576" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34653">
|
||||
<line x1="328.40895" y1="347.26178" x2="334.27316" y2="347.1806" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34652">
|
||||
<path d="M 334.02316 347.92627 L 334.02316 352.97393 L 330.4364 352.92666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34647">
|
||||
<g id="Line_34650">
|
||||
<line x1="328.93855" y1="320.1495" x2="328.98328" y2="325.3999" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34649">
|
||||
<line x1="329.09826" y1="322.4909" x2="334.27316" y2="322.4909" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34648">
|
||||
<path d="M 334.27316 322.22264 L 334.27316 317.39794 L 331.67416 317.34048" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34646">
|
||||
<text transform="translate(327.1081 295.95016)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">V</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="6" font-style="italic" font-weight="400" fill="black" y="9">DD</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34645">
|
||||
<line x1="334.08387" y1="334.901" x2="345.33387" y2="334.9412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34641">
|
||||
<g id="Line_34644">
|
||||
<path d="M 385.0852 341.37697 L 378.33666 341.37697 L 378.33666 348.99236 L 364.83956 348.99236 L 364.83956 341.37697 L 358.091 341.37697" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34643">
|
||||
<line x1="371.5881" y1="353.0116" x2="371.5881" y2="360.62697" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34642">
|
||||
<line x1="378.33666" y1="353.0116" x2="364.83956" y2="353.0116" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34640">
|
||||
<ellipse cx="371.5881" cy="313.92596" rx="2.66730707343084" ry="2.05484337132349" fill="white"/>
|
||||
<ellipse cx="371.5881" cy="313.92596" rx="2.66730707343084" ry="2.05484337132349" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34639">
|
||||
<line x1="358.091" y1="328.34014" x2="358.091" y2="341.37697" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34638">
|
||||
<line x1="385.091" y1="327.8346" x2="385.0852" y2="341.37697" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_34636">
|
||||
<text transform="translate(363.6936 294.09014)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34635">
|
||||
<text transform="translate(363.6936 361.71187)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[1]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34634">
|
||||
<line x1="381.70948" y1="293.8033" x2="365.2109" y2="293.68157" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Group_34630">
|
||||
<g id="Line_34633">
|
||||
<path d="M 358.091 243.62205 L 364.83956 243.62205 L 364.83956 236.00666 L 378.33666 236.00666 L 378.33666 243.62205 L 385.0852 243.62205" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34632">
|
||||
<line x1="371.5881" y1="231.98743" x2="371.5881" y2="224.37205" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34631">
|
||||
<line x1="364.83956" y1="231.98743" x2="378.33666" y2="231.98743" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34629"/>
|
||||
<g id="Graphic_34628">
|
||||
<text transform="translate(282.01068 244.9705)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">in[0]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34627">
|
||||
<text transform="translate(326.56772 274.41622)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="8" font-style="italic" font-weight="400" fill="black" x="0" y="7">GND</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34626">
|
||||
<line x1="311.83707" y1="263.2995" x2="311.83707" y2="250.4317" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34625">
|
||||
<line x1="303.35517" y1="250.43123" x2="311.83707" y2="250.26224" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34619">
|
||||
<g id="Group_34621">
|
||||
<g id="Line_34624">
|
||||
<path d="M 334.58707 249.68124 L 334.58707 244.0875 L 325.58707 244.0875 L 325.58707 232.9 L 334.58707 232.9 L 334.58707 227.30624" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34623">
|
||||
<line x1="320.83707" y1="238.49374" x2="311.83707" y2="238.49374" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34622">
|
||||
<line x1="320.83707" y1="244.0875" x2="320.83707" y2="232.9" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34620">
|
||||
<ellipse cx="318.58707" cy="237.88194" rx="2.00000319580378" ry="2.50000399475473" fill="white"/>
|
||||
<ellipse cx="318.58707" cy="237.88194" rx="2.00000319580378" ry="2.50000399475473" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34615">
|
||||
<g id="Line_34618">
|
||||
<path d="M 334.58707 274.487 L 334.58707 268.89324 L 325.58707 268.89324 L 325.58707 257.70574 L 334.58707 257.70574 L 334.58707 252.112" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34617">
|
||||
<line x1="320.83707" y1="263.2995" x2="311.83707" y2="263.2995" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34616">
|
||||
<line x1="320.83707" y1="268.89324" x2="320.83707" y2="257.70574" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Line_34614">
|
||||
<line x1="311.83707" y1="238.49374" x2="311.83707" y2="263.2995" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34610">
|
||||
<g id="Line_34613">
|
||||
<line x1="328.70628" y1="260.78625" x2="328.768" y2="265.7075" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34612">
|
||||
<line x1="328.9267" y1="263.1335" x2="334.7909" y2="263.05235" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34611">
|
||||
<path d="M 334.5409 263.798 L 334.5409 268.84567 L 330.95414 268.7984" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34606">
|
||||
<g id="Line_34609">
|
||||
<line x1="329.45628" y1="236.02123" x2="329.501" y2="241.27163" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34608">
|
||||
<line x1="329.616" y1="238.36263" x2="334.7909" y2="238.36263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34607">
|
||||
<path d="M 334.7909 238.09437 L 334.7909 233.26968 L 332.1919 233.2122" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34605">
|
||||
<text transform="translate(327.62583 211.8219)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">V</tspan>
|
||||
<tspan font-family="Times New Roman" font-size="6" font-style="italic" font-weight="400" fill="black" y="9">DD</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34604">
|
||||
<line x1="334.6016" y1="250.77275" x2="345.8516" y2="250.81292" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_34600">
|
||||
<g id="Line_34603">
|
||||
<path d="M 385.0852 256.65888 L 378.33666 256.65888 L 378.33666 264.27427 L 364.83956 264.27427 L 364.83956 256.65888 L 358.091 256.65888" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34602">
|
||||
<line x1="371.5881" y1="268.2935" x2="371.5881" y2="275.90888" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34601">
|
||||
<line x1="378.33666" y1="268.2935" x2="364.83956" y2="268.2935" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34599">
|
||||
<ellipse cx="371.5881" cy="229.20786" rx="2.66730707343084" ry="2.0548433713235" fill="white"/>
|
||||
<ellipse cx="371.5881" cy="229.20786" rx="2.66730707343084" ry="2.0548433713235" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34598">
|
||||
<line x1="358.091" y1="243.62205" x2="358.091" y2="256.65888" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34597">
|
||||
<line x1="385.091" y1="243.11652" x2="385.0852" y2="256.65888" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_34596">
|
||||
<text transform="translate(363.6936 209.37205)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[0]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34595">
|
||||
<text transform="translate(363.6936 276.99378)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[0]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34594">
|
||||
<line x1="381.70948" y1="210.5852" x2="365.2109" y2="210.46348" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Group_34590">
|
||||
<g id="Line_34593">
|
||||
<path d="M 358.966 431.84017 L 365.71456 431.84017 L 365.71456 424.2248 L 379.21166 424.2248 L 379.21166 431.84017 L 385.9602 431.84017" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34592">
|
||||
<line x1="372.4631" y1="420.20556" x2="372.4631" y2="412.59017" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34591">
|
||||
<line x1="365.71456" y1="420.20556" x2="379.21166" y2="420.20556" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_34586">
|
||||
<g id="Line_34589">
|
||||
<path d="M 385.9602 444.877 L 379.21166 444.877 L 379.21166 452.4924 L 365.71456 452.4924 L 365.71456 444.877 L 358.966 444.877" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34588">
|
||||
<line x1="372.4631" y1="456.5116" x2="372.4631" y2="464.127" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34587">
|
||||
<line x1="379.21166" y1="456.5116" x2="365.71456" y2="456.5116" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_34585">
|
||||
<ellipse cx="372.4631" cy="417.426" rx="2.66730707343078" ry="2.05484337132347" fill="white"/>
|
||||
<ellipse cx="372.4631" cy="417.426" rx="2.66730707343078" ry="2.05484337132347" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_34584">
|
||||
<line x1="385.966" y1="431.33465" x2="385.9602" y2="444.877" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_34583">
|
||||
<text transform="translate(364.5686 397.59017)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_34582">
|
||||
<text transform="translate(364.5686 465.2119)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="0" y="9">S[2]</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34581">
|
||||
<line x1="357.5939" y1="431.34017" x2="357.5939" y2="444.377" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34580">
|
||||
<line x1="346.091" y1="334.90102" x2="357.341" y2="334.9412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34579">
|
||||
<line x1="346.091" y1="438.401" x2="357.341" y2="438.4412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34578">
|
||||
<line x1="346.091" y1="250.77274" x2="357.341" y2="250.8129" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34577">
|
||||
<line x1="385.841" y1="250.1829" x2="397.091" y2="250.2231" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34576">
|
||||
<line x1="385.841" y1="334.90102" x2="397.091" y2="334.9412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34575">
|
||||
<line x1="385.841" y1="437.40536" x2="397.091" y2="437.44553" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34574">
|
||||
<line x1="397.091" y1="250.45016" x2="398.091" y2="437.40536" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_34803">
|
||||
<line x1="382.3518" y1="396.7119" x2="365.85325" y2="396.59017" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_34804">
|
||||
<text transform="translate(410.341 329.6886)" fill="black">
|
||||
<tspan font-family="Times New Roman" font-size="10" font-style="italic" font-weight="400" fill="black" x="2.5024414" y="9">out</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Line_34805">
|
||||
<line x1="398.091" y1="334.90102" x2="409.341" y2="334.9412" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 86 KiB |
|
@ -0,0 +1,16 @@
|
|||
.. _datasheet_sofa_chd:
|
||||
SOFA CHD
|
||||
|
||||
SOFA CHD
|
||||
--------
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
sofa_chd_fpga_arch
|
||||
|
||||
sofa_chd_io_resource
|
||||
|
||||
sofa_chd_clb_arch
|
||||
|
||||
sofa_chd_circuit_design
|
|
@ -0,0 +1,42 @@
|
|||
.. _sofa_chd_circuit_design:
|
||||
|
||||
Circuit Designs
|
||||
---------------
|
||||
|
||||
.. _sofa_chd_circuit_design_io:
|
||||
|
||||
I/O Circuit
|
||||
^^^^^^^^^^^
|
||||
|
||||
SOFA CHD FPGA share the same I/O circuit design as SOFA HD FPGA.
|
||||
See details at :ref:`sofa_hd_circuit_design_io`.
|
||||
|
||||
.. _sofa_hd_circuit_design_mux:
|
||||
|
||||
Multiplexer
|
||||
^^^^^^^^^^^
|
||||
|
||||
Routing multiplexer are designed by using a few custom cells based on the Skywater *High-Density* (HD) PDK, as shown in :numref:`fig_sofa_chd_mux_circuit`.
|
||||
The multiplexer design follows a two-level structure, which is applied to all the routing multiplexers in logic elements, connection blocks and switch blocks across the FPGA fabric.
|
||||
|
||||
.. _fig_sofa_chd_mux_circuit:
|
||||
|
||||
.. figure:: ./figures/sofa_chd_mux_circuit.svg
|
||||
:scale: 30%
|
||||
:alt: Schematic of multiplexer design in SOFA CHD FPGA
|
||||
|
||||
Schematic of multiplexer design in SOFA CHD FPGA
|
||||
|
||||
Each primitive in the two-level structure could be a 2/3/4-input custom cell, depending on the input size of the routing multiplexer.
|
||||
Each custom cell is built with input inverters and transmission-gates.
|
||||
For instance, :numref:`fig_sofa_chd_custom_mux_cells` shows the transistor-level design of a 3-input custom cell.
|
||||
|
||||
.. _fig_sofa_chd_custom_mux_cells:
|
||||
|
||||
.. figure:: ./figures/custom_mux_cells.svg
|
||||
:scale: 40%
|
||||
:alt: Detailed schematic of a 3-input custom cell in SOFA CHD FPGA
|
||||
|
||||
Detailed schematic of a 3-input custom cell in SOFA CHD FPGA
|
||||
|
||||
.. note:: Each routing multiplexer has a dedicated input which is connected to ground (GND) signal. When it is not used, the output will be driven by the ground, working as a constant generator.
|
|
@ -0,0 +1,7 @@
|
|||
.. _sofa_chd_clb_arch:
|
||||
|
||||
Configurable Logic Block
|
||||
------------------------
|
||||
|
||||
The SOFA CHD FPGA IP share the same *Configurable Logic Block* (CLB) architecture as QLSOFA HD FPGA IP.
|
||||
See details at :ref:`qlsofa_hd_clb_arch`.
|
|
@ -0,0 +1,7 @@
|
|||
.. _sofa_chd_fpga_arch:
|
||||
|
||||
Architecture
|
||||
-------------
|
||||
|
||||
SOFA CHD FPGA share the same architecture as QLSOFA HD FPGA.
|
||||
See full details at :ref:`qlsofa_hd_fpga_arch`.
|
|
@ -0,0 +1,7 @@
|
|||
.. _sofa_chd_io_resource:
|
||||
|
||||
I/O Resources
|
||||
-------------
|
||||
|
||||
The SOFA CHD FPGA IP share the same I/O resource arragement as QLSOFA HD FPGA IP.
|
||||
See details at :ref:`qlsofa_hd_io_resource`.
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="628.9111 1022.3935 418.46777 349.9947" width="418.46777" height="349.9947">
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xl="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="628.9111 1022.3935 418.46777 349.9947" width="418.46777" height="349.9947">
|
||||
<defs>
|
||||
<font-face font-family="Times" font-size="16" panose-1="0 0 5 0 0 0 0 9 0 0" units-per-em="1000" underline-position="-75.68359" underline-thickness="49.316406" slope="-937.5" x-height="446.28906" cap-height="652.34375" ascent="750" descent="-250" font-style="italic" font-weight="400">
|
||||
<font-face-src>
|
||||
|
@ -28,8 +28,8 @@
|
|||
</font-face-src>
|
||||
</font-face>
|
||||
</defs>
|
||||
<metadata> Produced by OmniGraffle 7.18\n2020-11-19 23:01:04 +0000</metadata>
|
||||
<g id="switch" fill="none" stroke="none" stroke-opacity="1" stroke-dasharray="none" fill-opacity="1">
|
||||
<metadata> Produced by OmniGraffle 7.18\n2020-12-11 18:21:49 +0000</metadata>
|
||||
<g id="switch" stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
|
||||
<title>switch</title>
|
||||
<g id="switch_boundary">
|
||||
<title>boundary</title>
|
||||
|
@ -38,7 +38,7 @@
|
|||
<path d="M 955.125 1083.375 L 744.75 1083.375 L 744.75 1316.25 L 955.125 1316.25 Z" stroke="gray" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.0,4.0" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Line_568">
|
||||
<line x1="955.125" y1="1235.206" x2="923.7813" y2="1235.9262" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="955.125" y1="1256.5479" x2="871.7645" y2="1256.5479" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_569">
|
||||
<path d="M 859.332 1083 L 859.332 1101.6667 L 886.389 1101.4805" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
|
@ -76,7 +76,7 @@
|
|||
<g id="switch_base">
|
||||
<title>base</title>
|
||||
<g id="Graphic_514">
|
||||
<text transform="translate(684.168 1226.7952)" fill="black">
|
||||
<text transform="translate(685.5234 1247.0479)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">SOC_IN</tspan>
|
||||
</text>
|
||||
</g>
|
||||
|
@ -86,13 +86,13 @@
|
|||
</text>
|
||||
</g>
|
||||
<g id="Line_517">
|
||||
<line x1="892.0556" y1="1236.2952" x2="743.3945" y2="1236.2952" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="839.3808" y1="1256.5479" x2="744.75" y2="1256.5479" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_518">
|
||||
<line x1="795.4195" y1="1203.125" x2="795.4195" y2="1277.7382" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_519">
|
||||
<line x1="907.753" y1="1203.0717" x2="907.7329" y2="1226.9284" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="855.0503" y1="1203.8125" x2="855.0503" y2="1247.1767" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_522">
|
||||
<line x1="956.4805" y1="1287.1037" x2="811.0889" y2="1287.1088" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
|
@ -103,7 +103,7 @@
|
|||
</text>
|
||||
</g>
|
||||
<g id="Graphic_524">
|
||||
<text transform="translate(960.125 1224.8457)" fill="black">
|
||||
<text transform="translate(960.125 1247.0479)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">FPGA_IN</tspan>
|
||||
</text>
|
||||
</g>
|
||||
|
@ -111,31 +111,28 @@
|
|||
<ellipse cx="795.4195" cy="1199.125" rx="2.53125404468923" ry="3.00000479370559" fill="black"/>
|
||||
<ellipse cx="795.4195" cy="1199.125" rx="2.53125404468923" ry="3.00000479370559" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_543">
|
||||
<line x1="743.3945" y1="1199.675" x2="904.2251" y2="1199.0847" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_544">
|
||||
<text transform="translate(673.5117 1190.3125)" fill="black">
|
||||
<text transform="translate(667.78125 1190.3125)" fill="black">
|
||||
<tspan font-family="Times" font-size="16" font-style="italic" font-weight="400" fill="black" x="0" y="15">SOC_DIR</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Graphic_545">
|
||||
<ellipse cx="907.7563" cy="1199.0717" rx="2.53125404468911" ry="3.00000479370553" fill="black"/>
|
||||
<ellipse cx="907.7563" cy="1199.0717" rx="2.53125404468911" ry="3.00000479370553" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<ellipse cx="855.0503" cy="1199.8125" rx="2.53125404468914" ry="3.00000479370565" fill="black"/>
|
||||
<ellipse cx="855.0503" cy="1199.8125" rx="2.53125404468914" ry="3.00000479370565" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Group_552">
|
||||
<g id="Graphic_556">
|
||||
<path d="M 907.8607 1148.8333 L 907.8607 1156.8333 C 909.8607 1176.8333 915.8607 1178.8333 927.8607 1188.8333 C 939.8607 1178.8333 945.8607 1176.8333 947.8607 1156.8333 L 947.8607 1148.8333 C 939.8607 1150.8333 938.8607 1151.8333 927.8607 1152.8333 C 916.8607 1151.8333 915.8607 1150.8333 907.8607 1148.8333" fill="white"/>
|
||||
<path d="M 907.8607 1148.8333 L 907.8607 1156.8333 C 909.8607 1176.8333 915.8607 1178.8333 927.8607 1188.8333 C 939.8607 1178.8333 945.8607 1176.8333 947.8607 1156.8333 L 947.8607 1148.8333 C 939.8607 1150.8333 938.8607 1151.8333 927.8607 1152.8333 C 916.8607 1151.8333 915.8607 1150.8333 907.8607 1148.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<path d="M 907.875 1149.375 L 907.875 1157.375 C 909.875 1177.375 915.875 1179.375 927.875 1189.375 C 939.875 1179.375 945.875 1177.375 947.875 1157.375 L 947.875 1149.375 C 939.875 1151.375 938.875 1152.375 927.875 1153.375 C 916.875 1152.375 915.875 1151.375 907.875 1149.375" fill="white"/>
|
||||
<path d="M 907.875 1149.375 L 907.875 1157.375 C 909.875 1177.375 915.875 1179.375 927.875 1189.375 C 939.875 1179.375 945.875 1177.375 947.875 1157.375 L 947.875 1149.375 C 939.875 1151.375 938.875 1152.375 927.875 1153.375 C 916.875 1152.375 915.875 1151.375 907.875 1149.375" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_555">
|
||||
<line x1="937.8607" y1="1138.8333" x2="937.8607" y2="1150.3333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="937.875" y1="1139.375" x2="937.875" y2="1150.875" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_554">
|
||||
<line x1="917.8607" y1="1138.8333" x2="917.8607" y2="1148.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="917.875" y1="1139.375" x2="917.875" y2="1149.375" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_553">
|
||||
<line x1="927.8607" y1="1187.541" x2="927.8607" y2="1198.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="927.875" y1="1188.0827" x2="927.875" y2="1199.375" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Graphic_558">
|
||||
|
@ -158,7 +155,7 @@
|
|||
</text>
|
||||
</g>
|
||||
<g id="Line_561">
|
||||
<path d="M 917.341 1107.3747 L 937.694 1107.1693 L 937.8607 1138.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<path d="M 917.341 1107.3747 L 937.694 1107.1693 L 937.875 1139.375" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_562">
|
||||
<line x1="740.5195" y1="1138.8849" x2="917.341" y2="1138.25" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
|
@ -169,7 +166,7 @@
|
|||
</text>
|
||||
</g>
|
||||
<g id="Line_564">
|
||||
<line x1="909.2875" y1="1199.0536" x2="927.8607" y2="1198.8333" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<line x1="856.5815" y1="1199.8033" x2="927.875" y2="1199.375" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_565">
|
||||
<line x1="778.791" y1="1287.0613" x2="746.0703" y2="1286.9666" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
|
@ -179,8 +176,8 @@
|
|||
<path d="M 950.625 1109.5817 L 950.625 1103.8796 L 950.625 1103.8796 L 950.625 1101.0285 L 961.0859 1106.7306 L 950.625 1112.4328 L 950.625 1109.5817 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_582">
|
||||
<path d="M 950.625 1237.0586 L 950.625 1231.3565 L 950.625 1231.3565 L 950.625 1228.5054 L 961.0859 1234.2075 L 950.625 1239.9097 L 950.625 1237.0586 Z" fill="#c0ffff"/>
|
||||
<path d="M 950.625 1237.0586 L 950.625 1231.3565 L 950.625 1231.3565 L 950.625 1228.5054 L 961.0859 1234.2075 L 950.625 1239.9097 L 950.625 1237.0586 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
<path d="M 950.625 1259.399 L 950.625 1253.6968 L 950.625 1253.6968 L 950.625 1250.8457 L 961.0859 1256.5479 L 950.625 1262.25 L 950.625 1259.399 Z" fill="#c0ffff"/>
|
||||
<path d="M 950.625 1259.399 L 950.625 1253.6968 L 950.625 1253.6968 L 950.625 1250.8457 L 961.0859 1256.5479 L 950.625 1262.25 L 950.625 1259.399 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_581">
|
||||
<path d="M 957.7109 1289.815 L 957.7109 1284.1128 L 957.7109 1284.1128 L 957.7109 1281.2617 L 947.25 1286.9639 L 957.7109 1292.666 L 957.7109 1289.815 Z" fill="#ff8080"/>
|
||||
|
@ -199,12 +196,12 @@
|
|||
<path d="M 740.0195 1141.8927 L 740.0195 1136.1906 L 740.0195 1136.1906 L 740.0195 1133.3395 L 750.4805 1139.0417 L 740.0195 1144.7438 L 740.0195 1141.8927 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_587">
|
||||
<path d="M 742.0195 1239.1968 L 742.0195 1233.4946 L 742.0195 1233.4946 L 742.0195 1230.6436 L 752.4805 1236.3457 L 742.0195 1242.0479 L 742.0195 1239.1968 Z" fill="#c0ffff"/>
|
||||
<path d="M 742.0195 1239.1968 L 742.0195 1233.4946 L 742.0195 1233.4946 L 742.0195 1230.6436 L 752.4805 1236.3457 L 742.0195 1242.0479 L 742.0195 1239.1968 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
<path d="M 740.0195 1259.399 L 740.0195 1253.6968 L 740.0195 1253.6968 L 740.0195 1250.8457 L 750.4805 1256.5479 L 740.0195 1262.25 L 740.0195 1259.399 Z" fill="#c0ffff"/>
|
||||
<path d="M 740.0195 1259.399 L 740.0195 1253.6968 L 740.0195 1253.6968 L 740.0195 1250.8457 L 750.4805 1256.5479 L 740.0195 1262.25 L 740.0195 1259.399 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_588">
|
||||
<path d="M 750.4805 1201.9761 L 750.4805 1196.2739 L 750.4805 1196.2739 L 750.4805 1193.4229 L 740.0195 1199.125 L 750.4805 1204.8271 L 750.4805 1201.9761 Z" fill="#ff8080"/>
|
||||
<path d="M 750.4805 1201.9761 L 750.4805 1196.2739 L 750.4805 1196.2739 L 750.4805 1193.4229 L 740.0195 1199.125 L 750.4805 1204.8271 L 750.4805 1201.9761 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
<path d="M 744.75 1201.9761 L 744.75 1196.2739 L 744.75 1196.2739 L 744.75 1193.4229 L 734.2891 1199.125 L 744.75 1204.8271 L 744.75 1201.9761 Z" fill="#ff8080"/>
|
||||
<path d="M 744.75 1201.9761 L 744.75 1196.2739 L 744.75 1196.2739 L 744.75 1193.4229 L 734.2891 1199.125 L 744.75 1204.8271 L 744.75 1201.9761 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_589">
|
||||
<path d="M 750.4805 1289.815 L 750.4805 1284.1128 L 750.4805 1284.1128 L 750.4805 1281.2617 L 740.0195 1286.9639 L 750.4805 1292.666 L 750.4805 1289.815 Z" fill="#ff8080"/>
|
||||
|
@ -229,8 +226,8 @@
|
|||
<path d="M 744.75 1360.601 L 744.75 1354.899 L 744.75 1354.899 L 744.75 1352.0479 L 755.2109 1357.75 L 744.75 1363.4521 L 744.75 1360.601 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
|
||||
</g>
|
||||
<g id="Graphic_595">
|
||||
<path d="M 893.0556 1219.8457 L 922.3945 1236.2952 L 893.0556 1252.7446 Z" fill="white"/>
|
||||
<path d="M 893.0556 1219.8457 L 922.3945 1236.2952 L 893.0556 1252.7446 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
<path d="M 840.3808 1240.0984 L 869.7197 1256.5479 L 840.3808 1272.9973 Z" fill="white"/>
|
||||
<path d="M 840.3808 1240.0984 L 869.7197 1256.5479 L 840.3808 1272.9973 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_597">
|
||||
<path d="M 810.0889 1270.6599 L 780.75 1287.1094 L 810.0889 1303.5588 Z" fill="white"/>
|
||||
|
@ -248,6 +245,21 @@
|
|||
<circle cx="917.8945" cy="1146.375" r="4.50000719055851" fill="white"/>
|
||||
<circle cx="917.8945" cy="1146.375" r="4.50000719055851" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_609">
|
||||
<circle cx="855.0503" cy="1244.5984" r="4.50000719055848" fill="white"/>
|
||||
<circle cx="855.0503" cy="1244.5984" r="4.50000719055848" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_610">
|
||||
<path d="M 864.3836 1215 L 855.0503 1231.6467 L 845.7169 1215 Z" fill="white"/>
|
||||
<path d="M 864.3836 1215 L 855.0503 1231.6467 L 845.7169 1215 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Graphic_611">
|
||||
<circle cx="855.5503" cy="1230.6235" r="2.5532776857906" fill="white"/>
|
||||
<circle cx="855.5503" cy="1230.6235" r="2.5532776857906" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
<g id="Line_612">
|
||||
<line x1="744.75" y1="1199.6042" x2="853.519" y2="1199.8096" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 86 KiB |
|
@ -21,7 +21,7 @@ As shown in :numref:`fig_sofa_hd_embedded_io_schematic`, the I/O circuit used in
|
|||
|
||||
- An internal configurable memory element to control the direction of I/O cell
|
||||
|
||||
The truth table of the I/O cell is consistent with the GPIO cell of Caravel SoC, where
|
||||
The truth table of the I/O cell is consistent with the GPIO cell of Caravel SoC (which requires an active-low signal to enable output directionality), where
|
||||
|
||||
- When configuration bit (FF output) is logic ``1``, the I/O cell is in input mode
|
||||
|
||||
|
@ -34,3 +34,36 @@ The truth table of the I/O cell is consistent with the GPIO cell of Caravel SoC,
|
|||
:alt: Schematic of embedded I/O cell used in FPGA
|
||||
|
||||
Schematic of embedded I/O cell used in FPGA
|
||||
|
||||
:numref:`fig_sofa_hd_embedded_io_test_waveform` shows an example waveform about how the I/O cell works:
|
||||
|
||||
- When ``IO_ISOL_N`` is enabled/disabled
|
||||
- When operates in input mode
|
||||
- When operates in output mode
|
||||
|
||||
.. _fig_sofa_hd_embedded_io_test_waveform:
|
||||
|
||||
.. figure:: ./figures/sofa_hd_embedded_io_test_waveform.svg
|
||||
:scale: 30%
|
||||
:alt: Schematic of embedded I/O cell used in FPGA
|
||||
|
||||
An example of waveforms of embedded I/O cell used in FPGA
|
||||
|
||||
|
||||
.. _sofa_hd_circuit_design_mux:
|
||||
|
||||
Multiplexer
|
||||
^^^^^^^^^^^
|
||||
|
||||
Routing multiplexer are designed by using the skywater *High-Density* (HD) 2-input MUX cell, as shown in :numref:`fig_sofa_hd_mux_circuit`.
|
||||
The tree-like multiplexer design is applied to all the routing multiplexers in logic elements, connection blocks and switch blocks across the FPGA fabric.
|
||||
|
||||
.. _fig_sofa_hd_mux_circuit:
|
||||
|
||||
.. figure:: ./figures/sofa_hd_mux_circuit.svg
|
||||
:scale: 30%
|
||||
:alt: Schematic of multiplexer design in SOFA HD FPGA
|
||||
|
||||
Schematic of multiplexer design in SOFA HD FPGA
|
||||
|
||||
.. note:: Each routing multiplexer has a dedicated input which is connected to ground (GND) signal. When it is not used, the output will be driven by the ground, working as a constant generator.
|
||||
|
|
After Width: | Height: | Size: 741 KiB |
|
@ -7,27 +7,27 @@ The High Density (HD) FPGAs are embedded FPGAs built with the Skywater 130nm Hig
|
|||
|
||||
.. table:: Logic capacity of High Density (HD) FPGA IPs
|
||||
|
||||
+-------------------------------+------------+-----------+
|
||||
| Resource/Capacity | SOFA HD | QLSOFA HD |
|
||||
+===============================+============+===========+
|
||||
| Look-Up Tables [1]_ | 1152 | 1152 |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Flip-flops | 2304 | 2304 |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Soft Adders [2]_ | N/A | 1152 |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Routing Channel Width [3]_ | 40 | 60 |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Max. Configuration Speed [4]_ | 50MHz | 50MHz |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Max. Operating Speed [4]_ | 50MHz | 50 MHz |
|
||||
+-------------------------------+------------+-----------+
|
||||
| User I/O Pins [5]_ | 144 | 144 |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Max. I/O Speed [4]_ | 33MHz | 33 MHz |
|
||||
+-------------------------------+------------+-----------+
|
||||
| Core Voltage | 1.8V | 1.8V |
|
||||
+-------------------------------+------------+-----------+
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Resource/Capacity | SOFA HD | QLSOFA HD | SOFA CHD |
|
||||
+===============================+============+===========+==========+
|
||||
| Look-Up Tables [1]_ | 1152 | 1152 | 1152 |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Flip-flops | 2304 | 2304 | 2304 |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Soft Adders [2]_ | N/A | 1152 | 1152 |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Routing Channel Width [3]_ | 40 | 60 | 60 |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Max. Configuration Speed [4]_ | 50MHz | 50MHz | 50MHz |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Max. Operating Speed [4]_ | 50MHz | 50 MHz | 50MHz |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| User I/O Pins [5]_ | 144 | 144 | 144 |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Max. I/O Speed [4]_ | 33MHz | 33MHz | 33MHz |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
| Core Voltage | 1.8V | 1.8V | 1.8V |
|
||||
+-------------------------------+------------+-----------+----------+
|
||||
|
||||
.. [1] counted by 4-input fracturable Look-Up Tables (LUTs), each of which can operate as dual-output 3-input LUTs or single-output 4-input LUT.
|
||||
|
||||
|
|
|
@ -3,9 +3,18 @@
|
|||
Introduction
|
||||
------------
|
||||
|
||||
All the FPGA devices in this project are fully open-source, from the architecture description to the physical design outputs, e.g., GDSII.
|
||||
All the devices are designed through the OpenFPGA framework and the Skywater 130nm PDK.
|
||||
The devices are embedded FPGA IPs, which are designed to interface the caravel SoC interface.
|
||||
We aims to empower embedded applications with its low-cost design approach but high-density architecture.
|
||||
Operating temperature ranging from 0 :math:`^\circ C` to 85 :math:`^\circ C`
|
||||
*Skywater Opensource FpgA* (SOFA) is a fully open-source embedded FPGA IP library, from the architecture description to production ready layouts.
|
||||
As illustrated in :numref:`fig_sofa_motivation`, SOFA IPs are designed through the Skywater 130nm PDK, OpenFPGA framework and Synopsys IC Compiler II.
|
||||
The runtime of the design flow for each IP is within 24 hours.
|
||||
|
||||
All the SOFA FPGAs are designed to interface the Caravel SoC interface.
|
||||
We aims to empower embedded applications with its low-cost design approach but high-density architecture.
|
||||
|
||||
.. _fig_sofa_motivation:
|
||||
|
||||
.. figure:: ./figures/sofa_motivation.png
|
||||
:scale: 15%
|
||||
:alt: 24-hour FPGA IP development: from PDK to production-ready layout
|
||||
|
||||
24-hour FPGA IP development: from PDK to production-ready layout
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Welcome to SKywater-OpenFPGA documentation!
|
||||
===========================================
|
||||
Welcome to SOFA documentation!
|
||||
==============================
|
||||
|
||||
.. toctree::
|
||||
:caption: Device Family
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
//-------------------------------------------
|
||||
// A file to include all the dependency HDL codes
|
||||
// required by Caravel gate-level netlists
|
||||
//-------------------------------------------
|
||||
//----- Time scale -----
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
`define USE_POWER_PINS 1
|
||||
|
||||
////////////////////////////////////
|
||||
// Skywater standard cell netlists
|
||||
// I/O cells
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_io/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
|
||||
// High density cells
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
|
||||
// High voltage cells
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/skywater-openfpga/PDK/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
|
||||
|
||||
// Gate-level netlists
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/DFFRAM.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/caravel.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/chip_io.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/digital_pll.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/mgmt_core.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/storage.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/user_id_programming.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/user_proj_example.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/gl/user_project_wrapper.v"
|
||||
|
||||
// Use RTL codes for the following module as the gate-level netlists are buggy
|
||||
// in handling power pins
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/defines.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/mgmt_protect.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/mgmt_protect_hv.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/gpio_control_block.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/simple_por.v"
|
||||
`include "/research/ece/lnis/USERS/tang/github/caravel/verilog/rtl/sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
|
|
@ -58,9 +58,9 @@ custom_nlist = open(args.output_verilog, "w")
|
|||
#######################################################################
|
||||
# A function to generate Verilog codes for a MUX3 custom cell
|
||||
# Given an input index
|
||||
def generate_verilog_codes_custom_cell_mux3(first_input_index, instance_index):
|
||||
def generate_verilog_codes_custom_cell_mux3(first_input_index, instance_index, add_inverter_follower):
|
||||
lines = []
|
||||
|
||||
# Instanciate a 3-input MUX cell
|
||||
lines.append("\tscs8hd_muxinv3_1 scs8hd_muxinv3_1_" + str(instance_index) + "(")
|
||||
lines.append("\t .Q1(in[" + str(first_input_index) + "]),")
|
||||
lines.append("\t .Q2(in[" + str(first_input_index + 1) + "]),")
|
||||
|
@ -71,17 +71,28 @@ def generate_verilog_codes_custom_cell_mux3(first_input_index, instance_index):
|
|||
lines.append("\t .S1B(mem_inv[" + str(first_input_index + 1) + "]),")
|
||||
lines.append("\t .S2(mem[" + str(first_input_index + 2) + "]),")
|
||||
lines.append("\t .S2B(mem_inv[" + str(first_input_index + 2) + "]),")
|
||||
lines.append("\t .Z(out[0])")
|
||||
if (add_inverter_follower):
|
||||
lines.append("\t .Z(out_inv[0])")
|
||||
else:
|
||||
lines.append("\t .Z(out[0])")
|
||||
lines.append("\t );")
|
||||
|
||||
# Instanciate an inverter follower to pair the MUX cells (which has input inverters)
|
||||
if (add_inverter_follower):
|
||||
lines.append("\tsky130_fd_sc_hd__inv_1 scs8hd_muxinv3_1_inv_follower" + str(instance_index) + "(")
|
||||
lines.append("\t .A(out_inv[0]),")
|
||||
lines.append("\t .Y(out[0])")
|
||||
lines.append("\t );")
|
||||
|
||||
return lines
|
||||
|
||||
#######################################################################
|
||||
# A function to generate Verilog codes for a MUX3 custom cell
|
||||
# Given an input index
|
||||
def generate_verilog_codes_custom_cell_mux2(first_input_index, instance_index):
|
||||
def generate_verilog_codes_custom_cell_mux2(first_input_index, instance_index, add_inverter_follower):
|
||||
lines = []
|
||||
|
||||
# Instanciate a 2-input MUX cell
|
||||
lines.append("\tscs8hd_muxinv2_1 scs8hd_muxinv2_1_" + str(instance_index) + "(")
|
||||
lines.append("\t .Q1(in[" + str(first_input_index) + "]),")
|
||||
lines.append("\t .Q2(in[" + str(first_input_index + 1) + "]),")
|
||||
|
@ -89,9 +100,19 @@ def generate_verilog_codes_custom_cell_mux2(first_input_index, instance_index):
|
|||
lines.append("\t .S0B(mem_inv[" + str(first_input_index) + "]),")
|
||||
lines.append("\t .S1(mem[" + str(first_input_index + 1) + "]),")
|
||||
lines.append("\t .S1B(mem_inv[" + str(first_input_index + 1) + "]),")
|
||||
lines.append("\t .Z(out[0])")
|
||||
if (add_inverter_follower):
|
||||
lines.append("\t .Z(out_inv[0])")
|
||||
else:
|
||||
lines.append("\t .Z(out[0])")
|
||||
lines.append("\t );")
|
||||
|
||||
# Instanciate an inverter follower to pair the MUX cells (which has input inverters)
|
||||
if (add_inverter_follower):
|
||||
lines.append("\tsky130_fd_sc_hd__inv_1 scs8hd_muxinv2_1_inv_follower" + str(instance_index) + "(")
|
||||
lines.append("\t .A(out_inv[0]),")
|
||||
lines.append("\t .Y(out[0])")
|
||||
lines.append("\t );")
|
||||
|
||||
return lines
|
||||
|
||||
#######################################################################
|
||||
|
@ -116,8 +137,12 @@ def generate_verilog_codes_standard_cell_mux2(first_input_index, instance_index)
|
|||
# In this case, an standard cell will be outputted
|
||||
# - If the memory size is larger than 1, the input size should be the same
|
||||
# as memory size. In this case, we will output custom cells
|
||||
def write_custom_mux_cells_to_file(custom_nlist, input_size, mem_size):
|
||||
def write_custom_mux_cells_to_file(custom_nlist, input_size, mem_size, add_inverter_follower):
|
||||
lines = []
|
||||
|
||||
if (add_inverter_follower):
|
||||
lines.append("wire [0:0] out_inv;")
|
||||
|
||||
if (1 == mem_size):
|
||||
assert(2 == input_size)
|
||||
# Output a standard cell, currently we support HD cell MUX2
|
||||
|
@ -132,17 +157,17 @@ def write_custom_mux_cells_to_file(custom_nlist, input_size, mem_size):
|
|||
# - a few MUX2 cells
|
||||
if (1 == input_size % 2):
|
||||
assert(3 <= input_size)
|
||||
for line in generate_verilog_codes_custom_cell_mux3(0, 0):
|
||||
for line in generate_verilog_codes_custom_cell_mux3(0, 0, add_inverter_follower):
|
||||
lines.append(line)
|
||||
for mux2_inst in range(int((input_size - 3) / 2)):
|
||||
for line in generate_verilog_codes_custom_cell_mux2(3 + 2 * mux2_inst, mux2_inst):
|
||||
for line in generate_verilog_codes_custom_cell_mux2(3 + 2 * mux2_inst, mux2_inst, add_inverter_follower):
|
||||
lines.append(line)
|
||||
# - If the input size is an even number, we will use
|
||||
# - a few MUX2 cells
|
||||
else:
|
||||
assert (0 == input_size % 2)
|
||||
for mux2_inst in range(int(input_size / 2)):
|
||||
for line in generate_verilog_codes_custom_cell_mux2(2 * mux2_inst, mux2_inst):
|
||||
for line in generate_verilog_codes_custom_cell_mux2(2 * mux2_inst, mux2_inst, add_inverter_follower):
|
||||
lines.append(line)
|
||||
|
||||
# Output lines to file
|
||||
|
@ -154,6 +179,7 @@ with open(args.template_netlist, "r") as wp:
|
|||
template_nlist = wp.readlines()
|
||||
# A flag for write the current line or skip
|
||||
output_action = "copy"
|
||||
mux_structure = "1level"
|
||||
input_size = 0
|
||||
mem_size = 0
|
||||
for line_num, curr_line in enumerate(template_nlist):
|
||||
|
@ -168,6 +194,12 @@ with open(args.template_netlist, "r") as wp:
|
|||
mem_size = int(re.findall("input(\d+)_mem(\d+)\(", curr_line)[0][1])
|
||||
assert(input_size > 0)
|
||||
assert(mem_size > 0)
|
||||
# Find the MUX structure levels
|
||||
if (re.search("1level", curr_line)):
|
||||
mux_structure = "1level"
|
||||
else:
|
||||
assert(re.search("2level", curr_line))
|
||||
mux_structure = "2level"
|
||||
# Change status indicating that we are now inside a module
|
||||
output_action = "copy"
|
||||
|
||||
|
@ -179,7 +211,7 @@ with open(args.template_netlist, "r") as wp:
|
|||
# Reaching the end of the current module
|
||||
# Now output the custom cell instanciation
|
||||
if (curr_line.startswith("endmodule")):
|
||||
write_custom_mux_cells_to_file(custom_nlist, input_size, mem_size)
|
||||
write_custom_mux_cells_to_file(custom_nlist, input_size, mem_size, "1level" != mux_structure)
|
||||
output_action = "copy"
|
||||
|
||||
if ("skip" != output_action):
|
||||
|
|
|
@ -37,7 +37,7 @@ module EMBEDDED_IO_HD (
|
|||
sky130_fd_sc_hd__or2b_4 ISOL_EN_GATE (.B_N(IO_ISOL_N),
|
||||
.A(FPGA_DIR),
|
||||
.X(SOC_DIR)
|
||||
);
|
||||
);
|
||||
|
||||
// Use drive-strength 4 for a high fan-out from global routing architecture
|
||||
sky130_fd_sc_hd__inv_1 INV_SOC_DIR (.A(SOC_DIR), .Y(SOC_DIR_N));
|
||||
|
|
|
@ -16,6 +16,9 @@ import argparse
|
|||
import logging
|
||||
import subprocess
|
||||
import glob
|
||||
import threading
|
||||
import multiprocessing
|
||||
import run_post_pnr_msim_test
|
||||
|
||||
#####################################################################
|
||||
# Initialize logger
|
||||
|
@ -64,15 +67,16 @@ num_sim_finished = 0
|
|||
msim_testrun_script_abspath = os.path.abspath(__file__)
|
||||
msim_testrun_script_abspath = re.sub(os.path.basename(msim_testrun_script_abspath), "run_post_pnr_msim_test.py", msim_testrun_script_abspath)
|
||||
|
||||
threads = []
|
||||
for testbench_file in testbench_files:
|
||||
# Find testbench name
|
||||
testbench_name = re.findall("(\w+)_include_netlists.v", os.path.basename(testbench_file))[0]
|
||||
cmd = "python3 " + msim_testrun_script_abspath \
|
||||
+ " --verilog_testbench " + testbench_file \
|
||||
+ " --project_path " + msim_task_dir_abspath + "/" + testbench_name \
|
||||
+ " --testbench_name " + testbench_name + "_autocheck_top_tb"
|
||||
subprocess.run(cmd, shell=True, check=True)
|
||||
num_sim_finished += 1
|
||||
process = multiprocessing.Process(target=run_post_pnr_msim_test.run_msim, args=(testbench_file, msim_task_dir_abspath + "/" + testbench_name, testbench_name + "_autocheck_top_tb",))
|
||||
process.start()
|
||||
threads.append(process)
|
||||
|
||||
for process in threads:
|
||||
process.join()
|
||||
|
||||
logging.info("Done")
|
||||
logging.info("Finish " + str(num_sim_finished) + " ModelSim simulations")
|
||||
logging.info("Finish " + str(len(threads)) + " ModelSim simulations")
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
# - Analyze output log files and return succeed or failure
|
||||
#####################################################################
|
||||
|
||||
import sys
|
||||
import os
|
||||
from os.path import dirname, abspath, isfile
|
||||
import shutil
|
||||
|
@ -18,138 +19,150 @@ import subprocess
|
|||
# Initialize logger
|
||||
#####################################################################
|
||||
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
|
||||
#####################################################################
|
||||
# Main function of this script, so that it can be called by other scripts
|
||||
#####################################################################
|
||||
def main(args):
|
||||
#####################################################################
|
||||
# Parse the options
|
||||
#####################################################################
|
||||
parser = argparse.ArgumentParser(description='Run ModelSim verification for a testbench')
|
||||
parser.add_argument('--verilog_testbench', required=True,
|
||||
help='Specify the file path for the Verilog testbench as input')
|
||||
parser.add_argument('--project_path', required=True,
|
||||
help='Specify the file path to create the ModelSim project')
|
||||
parser.add_argument('--testbench_name', required=True,
|
||||
help='Specify the top-level module of the testbench')
|
||||
args = parser.parse_args(args)
|
||||
|
||||
run_msim(args.verilog_testbench, args.project_path, args.testbench_name)
|
||||
|
||||
#####################################################################
|
||||
# Parse the options
|
||||
# Main function of this script, so that it can be called by other scripts
|
||||
#####################################################################
|
||||
parser = argparse.ArgumentParser(description='Run ModelSim verification for a testbench')
|
||||
parser.add_argument('--verilog_testbench', required=True,
|
||||
help='Specify the file path for the Verilog testbench as input')
|
||||
parser.add_argument('--project_path', required=True,
|
||||
help='Specify the file path to create the ModelSim project')
|
||||
parser.add_argument('--testbench_name', required=True,
|
||||
help='Specify the top-level module of the testbench')
|
||||
args = parser.parse_args()
|
||||
def run_msim(verilog_testbench, project_path, testbench_name):
|
||||
#####################################################################
|
||||
# Check options:
|
||||
# - Input testbench file must be valid
|
||||
# Otherwise, error out
|
||||
# - If the modelsim project path does not exist, create it
|
||||
#####################################################################
|
||||
if not isfile(verilog_testbench):
|
||||
logging.error("Invalid Verilog testbench: " + verilog_testbench + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
project_abs_path = os.path.abspath(project_path)
|
||||
if not os.path.isdir(project_abs_path):
|
||||
logging.debug("Creating ModelSim project directory : " + project_abs_path + " ...\n")
|
||||
os.makedirs(project_abs_path, exist_ok=True)
|
||||
logging.debug("Done\n")
|
||||
|
||||
#####################################################################
|
||||
# Create the Tcl script for Modelsim
|
||||
#####################################################################
|
||||
# Get modelsim process tcl file path
|
||||
msim_proc_tcl_path = os.path.abspath(__file__)
|
||||
msim_proc_tcl_path = re.sub(os.path.basename(msim_proc_tcl_path), "modelsim_proc.tcl", msim_proc_tcl_path)
|
||||
if not isfile(msim_proc_tcl_path):
|
||||
logging.error("Invalid process script for ModelSim: " + msim_proc_tcl_path + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
# Create output file handler
|
||||
tcl_file_path = project_abs_path + "/" + os.path.basename(testbench_name) + ".tcl"
|
||||
logging.debug("Generating Tcl script for ModelSim: " + tcl_file_path)
|
||||
tcl_file = open(tcl_file_path, "w")
|
||||
|
||||
# A string buffer to write tcl content
|
||||
tcl_lines = []
|
||||
|
||||
tcl_lines.append("echo \"==============================\"")
|
||||
tcl_lines.append("pwd")
|
||||
tcl_lines.append("echo \"==============================\"")
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("set project_name " + testbench_name)
|
||||
tcl_lines.append("set top_tb " + testbench_name)
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("set project_path \"" + project_abs_path + "\"")
|
||||
tcl_lines.append("set verilog_files \"" + os.path.abspath(verilog_testbench) + "\"")
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("source " + msim_proc_tcl_path)
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("try {")
|
||||
tcl_lines.append("\ttop_create_new_project $project_name $verilog_files $project_path $top_tb")
|
||||
tcl_lines.append("} finally {")
|
||||
tcl_lines.append("\tquit")
|
||||
tcl_lines.append("}")
|
||||
|
||||
for line in tcl_lines:
|
||||
tcl_file.write(line + "\n")
|
||||
|
||||
tcl_file.close()
|
||||
logging.debug("Done")
|
||||
|
||||
#####################################################################
|
||||
# Run ModelSim simulation
|
||||
#####################################################################
|
||||
curr_dir = os.getcwd()
|
||||
# Change to the project directory
|
||||
os.chdir(project_abs_path)
|
||||
logging.debug("Changed to directory: " + project_abs_path)
|
||||
|
||||
# Run ModelSim
|
||||
vsim_log_file_path = project_abs_path + "/vsim_run_log"
|
||||
vsim_bin = "/uusoc/facility/cad_tools/Mentor/modelsim10.7b/modeltech/bin/vsim"
|
||||
vsim_cmd = vsim_bin + " -c -do " + os.path.abspath(tcl_file_path) + " > " + vsim_log_file_path
|
||||
logging.debug("Running modelsim by : " + vsim_cmd)
|
||||
subprocess.run(vsim_cmd, shell=True, check=True)
|
||||
|
||||
# Go back to current directory
|
||||
os.chdir(curr_dir)
|
||||
|
||||
#####################################################################
|
||||
# Parse log files and report any errors
|
||||
#####################################################################
|
||||
vsim_log_file = open(vsim_log_file_path, "r")
|
||||
|
||||
# Error counter
|
||||
num_err = 0
|
||||
num_err_lines_found = 0
|
||||
verification_passed = False
|
||||
|
||||
for line in vsim_log_file:
|
||||
# Check errors from self-testing testbench output
|
||||
if line.startswith("# Simulation finish with") :
|
||||
num_sim_err = int(re.findall("# Simulation finish with(\s+)(\d+) errors", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
if (0 < num_sim_err) :
|
||||
logging.error("Simulation failed with " + str(num_sim_err) + " errors!\n")
|
||||
# Add to total errors
|
||||
num_err += num_sim_err
|
||||
if line.startswith("# Simulation Failed with") :
|
||||
print (line)
|
||||
num_sim_err = int(re.findall("# Simulation Failed with(\s+)(\d+) error\(s\)", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
if (0 < num_sim_err) :
|
||||
logging.error("Simulation failed with " + str(num_sim_err) + " errors!\n")
|
||||
# Add to total errors
|
||||
num_err += num_sim_err
|
||||
# Check total errors by Modelsim
|
||||
if line.startswith("# Errors:") :
|
||||
num_msim_err = int(re.findall("# Errors:(\s)(\d+),", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
num_err += num_msim_err
|
||||
|
||||
vsim_log_file.close()
|
||||
|
||||
if (0 == num_err_lines_found) :
|
||||
logging.error("No error lines found!Something wrong in setting up modelsim simulation\n")
|
||||
elif (0 < num_err) :
|
||||
logging.error("ModelSim failed with " + str(num_err) + " errors!\n")
|
||||
else :
|
||||
verification_passed = True
|
||||
|
||||
if (verification_passed) :
|
||||
logging.info(testbench_name + "...[Passed]\n")
|
||||
else :
|
||||
logging.error(testbench_name + "...[Failed]\n")
|
||||
|
||||
#####################################################################
|
||||
# Check options:
|
||||
# - Input testbench file must be valid
|
||||
# Otherwise, error out
|
||||
# - If the modelsim project path does not exist, create it
|
||||
#####################################################################
|
||||
if not isfile(args.verilog_testbench):
|
||||
logging.error("Invalid Verilog testbench: " + args.verilog_testbench + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
project_abs_path = os.path.abspath(args.project_path)
|
||||
if not os.path.isdir(project_abs_path):
|
||||
logging.debug("Creating ModelSim project directory : " + project_abs_path + " ...\n")
|
||||
os.makedirs(project_abs_path, exist_ok=True)
|
||||
logging.debug("Done\n")
|
||||
|
||||
#####################################################################
|
||||
# Create the Tcl script for Modelsim
|
||||
#####################################################################
|
||||
# Get modelsim process tcl file path
|
||||
msim_proc_tcl_path = os.path.abspath(__file__)
|
||||
msim_proc_tcl_path = re.sub(os.path.basename(msim_proc_tcl_path), "modelsim_proc.tcl", msim_proc_tcl_path)
|
||||
if not isfile(msim_proc_tcl_path):
|
||||
logging.error("Invalid process script for ModelSim: " + msim_proc_tcl_path + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
# Create output file handler
|
||||
tcl_file_path = project_abs_path + "/" + os.path.basename(args.testbench_name) + ".tcl"
|
||||
logging.debug("Generating Tcl script for ModelSim: " + tcl_file_path)
|
||||
tcl_file = open(tcl_file_path, "w")
|
||||
|
||||
# A string buffer to write tcl content
|
||||
tcl_lines = []
|
||||
|
||||
tcl_lines.append("echo \"==============================\"")
|
||||
tcl_lines.append("pwd")
|
||||
tcl_lines.append("echo \"==============================\"")
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("set project_name " + args.testbench_name)
|
||||
tcl_lines.append("set top_tb " + args.testbench_name)
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("set project_path \"" + project_abs_path + "\"")
|
||||
tcl_lines.append("set verilog_files \"" + os.path.abspath(args.verilog_testbench) + "\"")
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("source " + msim_proc_tcl_path)
|
||||
tcl_lines.append("\n")
|
||||
tcl_lines.append("try {")
|
||||
tcl_lines.append("\ttop_create_new_project $project_name $verilog_files $project_path $top_tb")
|
||||
tcl_lines.append("} finally {")
|
||||
tcl_lines.append("\tquit")
|
||||
tcl_lines.append("}")
|
||||
|
||||
for line in tcl_lines:
|
||||
tcl_file.write(line + "\n")
|
||||
|
||||
tcl_file.close()
|
||||
logging.debug("Done")
|
||||
|
||||
#####################################################################
|
||||
# Run ModelSim simulation
|
||||
#####################################################################
|
||||
curr_dir = os.getcwd()
|
||||
# Change to the project directory
|
||||
os.chdir(project_abs_path)
|
||||
logging.debug("Changed to directory: " + project_abs_path)
|
||||
|
||||
# Run ModelSim
|
||||
vsim_log_file_path = project_abs_path + "/vsim_run_log"
|
||||
vsim_bin = "/uusoc/facility/cad_tools/Mentor/modelsim10.7b/modeltech/bin/vsim"
|
||||
vsim_cmd = vsim_bin + " -c -do " + os.path.abspath(tcl_file_path) + " > " + vsim_log_file_path
|
||||
logging.debug("Running modelsim by : " + vsim_cmd)
|
||||
subprocess.run(vsim_cmd, shell=True, check=True)
|
||||
|
||||
# Go back to current directory
|
||||
os.chdir(curr_dir)
|
||||
|
||||
#####################################################################
|
||||
# Parse log files and report any errors
|
||||
#####################################################################
|
||||
vsim_log_file = open(vsim_log_file_path, "r")
|
||||
|
||||
# Error counter
|
||||
num_err = 0
|
||||
num_err_lines_found = 0
|
||||
verification_passed = False
|
||||
|
||||
for line in vsim_log_file:
|
||||
# Check errors from self-testing testbench output
|
||||
if line.startswith("# Simulation finish with") :
|
||||
num_sim_err = int(re.findall("# Simulation finish with(\s+)(\d+) errors", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
if (0 < num_sim_err) :
|
||||
logging.error("Simulation failed with " + str(num_sim_err) + " errors!\n")
|
||||
# Add to total errors
|
||||
num_err += num_sim_err
|
||||
if line.startswith("# Simulation Failed with") :
|
||||
print (line)
|
||||
num_sim_err = int(re.findall("# Simulation Failed with(\s+)(\d+) error\(s\)", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
if (0 < num_sim_err) :
|
||||
logging.error("Simulation failed with " + str(num_sim_err) + " errors!\n")
|
||||
# Add to total errors
|
||||
num_err += num_sim_err
|
||||
# Check total errors by Modelsim
|
||||
if line.startswith("# Errors:") :
|
||||
num_msim_err = int(re.findall("# Errors:(\s)(\d+),", line)[0][1])
|
||||
num_err_lines_found += 1
|
||||
num_err += num_msim_err
|
||||
|
||||
vsim_log_file.close()
|
||||
|
||||
if (0 == num_err_lines_found) :
|
||||
logging.error("No error lines found!Something wrong in setting up modelsim simulation\n")
|
||||
elif (0 < num_err) :
|
||||
logging.error("ModelSim failed with " + str(num_err) + " errors!\n")
|
||||
else :
|
||||
verification_passed = True
|
||||
|
||||
if (verification_passed) :
|
||||
logging.info(args.testbench_name + "...[Passed]\n")
|
||||
else :
|
||||
logging.error(args.testbench_name + "...[Failed]\n")
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
# Skywater PDK
|
||||
This directory is the workspace for running Synopsys Design Compiler for FPGA primitives
|
||||
This required to synthesis decoders in FPGA fabrics
|
||||
Please keep this directory clean and organize as follows:
|
||||
- **HDL**: Any HDL to synthesis
|
||||
- **SCRIPT**: Scripts to enable Design Compile runs
|
||||
- **RPT**: Report files from Design Compiler runs
|
||||
- **TEMP**: workspace for Design Compiler projects
|
||||
- READMD is the only file allowed in the directory, others should be sub-directories.
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
##########################################################
|
||||
# Template scripts to synthesize a combinational circuit
|
||||
# using Design Compiler
|
||||
# Author: Xifan Tang
|
||||
# Organization: University of Utah
|
||||
# Date: September 4th, 2020
|
||||
##########################################################
|
||||
|
||||
# Variable declaration
|
||||
set CTRITICAL_PATH 1; # [ns]
|
||||
|
||||
# Make sure a clean start
|
||||
remove_design -all
|
||||
|
||||
set DB_FILE "/research/ece/lnis/CAD_TOOLS/DKITS/skywater/skywater-pdk/vendor/synopsys/results/lib/sky130_fd_sc_hd/db_nldm/sky130_fd_sc_hd__tt_025C_1v80.db"
|
||||
|
||||
# Read standard cell library
|
||||
# Here we consider the Skywater 130nm High Density(HD) cell library
|
||||
read_db ${DB_FILE}
|
||||
set target_library ${DB_FILE}
|
||||
set link_library ${DB_FILE}
|
||||
|
||||
set DESIGN_NAME DESIGN_NAME_VAR
|
||||
set RTL_NETLIST RTL_NETLIST_VAR
|
||||
|
||||
# Parse the HDL
|
||||
analyze -f verilog ${RTL_NETLIST}
|
||||
elaborate ${DESIGN_NAME}
|
||||
|
||||
# Set constraints
|
||||
# Push to 0 for the minimum area
|
||||
set_max_area 0
|
||||
|
||||
# Link to technology library and start compilation
|
||||
link
|
||||
compile -map_effort high
|
||||
|
||||
# Output netlist
|
||||
write -format Verilog -output ../GATE_NETLISTS/${DESIGN_NAME}_post_synth.v
|
||||
|
||||
# Report results
|
||||
report_unit > ../RPT/${DESIGN_NAME}_unit.rpt
|
||||
report_area > ../RPT/${DESIGN_NAME}_area.rpt
|
||||
report_timing > ../RPT/${DESIGN_NAME}_timing.rpt
|
||||
report_power > ../RPT/${DESIGN_NAME}_power.rpt
|
||||
report_reference > ../RPT/${DESIGN_NAME}_reference.rpt
|
||||
|
||||
# Finish here
|
||||
exit
|
||||
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
#####################################################################
|
||||
# Python script to execute Design Compiler Synthesis for a given template tcl script
|
||||
# This script will
|
||||
# - Create the tcl script as synthesis recipe
|
||||
# - Run Design Compiler
|
||||
# - Analyze output log files and return succeed or failure
|
||||
#####################################################################
|
||||
|
||||
import sys
|
||||
import os
|
||||
from os.path import dirname, abspath, isfile
|
||||
import shutil
|
||||
import re
|
||||
import argparse
|
||||
import logging
|
||||
import subprocess
|
||||
|
||||
#####################################################################
|
||||
# Initialize logger
|
||||
#####################################################################
|
||||
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
|
||||
#####################################################################
|
||||
# Main function of this script, so that it can be called by other scripts
|
||||
#####################################################################
|
||||
def main(args):
|
||||
#####################################################################
|
||||
# Parse the options
|
||||
#####################################################################
|
||||
parser = argparse.ArgumentParser(description='Run Synopsys Design Compiler Synthesis for an input netlist')
|
||||
parser.add_argument('--rtl_netlist', required=True,
|
||||
help='Specify the file path to the RTL netlist as input')
|
||||
parser.add_argument('--recipe_template', required=True,
|
||||
help='Specify the file path to tcl script contain template synthesis recipe')
|
||||
parser.add_argument('--technology_library', required=True,
|
||||
help='Specify the technology library which the RTL netlist will be mapped to')
|
||||
parser.add_argument('--project_workspace', required=True,
|
||||
help='Specify the directory to run Design Compiler')
|
||||
args = parser.parse_args(args)
|
||||
|
||||
run_dc_batch_synth(args.rtl_netlist, args.recipe_template, args.technology_library, args.project_workspace)
|
||||
|
||||
#####################################################################
|
||||
# A function to execute a single-run of Design Compiler for a RTL design
|
||||
#####################################################################
|
||||
def run_dc_synth(rtl_netlist, rtl_design_name, recipe_template, technology_library, project_workspace):
|
||||
project_abs_path = os.path.abspath(project_workspace)
|
||||
if not os.path.isdir(project_abs_path):
|
||||
logging.debug("Creating Design Compiler project directory : " + project_abs_path + " ...\n")
|
||||
os.makedirs(project_abs_path, exist_ok=True)
|
||||
logging.debug("Done\n")
|
||||
|
||||
#####################################################################
|
||||
# Create the Tcl script for Design Compiler
|
||||
#####################################################################
|
||||
# Get absolute path to the template tcl script, it must be valid
|
||||
template_tcl_path = os.path.abspath(recipe_template)
|
||||
assert(isfile(template_tcl_path))
|
||||
|
||||
# Create output file handler
|
||||
tcl_file_path = project_abs_path + "/" + os.path.basename(rtl_design_name) + "_dc.tcl"
|
||||
logging.debug("Generating Tcl script from template recipe: " + tcl_file_path)
|
||||
|
||||
tcl_file = open(tcl_file_path, "w")
|
||||
|
||||
with open(template_tcl_path, "r") as wp:
|
||||
template_tcl_file = wp.readlines()
|
||||
for line_num, curr_line in enumerate(template_tcl_file):
|
||||
line2output = curr_line
|
||||
# Replace keywords with custom values
|
||||
line2output = re.sub("TECH_DB_VAR", technology_library, curr_line)
|
||||
line2output = re.sub("DESIGN_NAME_VAR", rtl_design_name, curr_line)
|
||||
line2output = re.sub("RTL_NETLIST_VAR", rtl_netlist, curr_line)
|
||||
# Finished processing
|
||||
# Output the line
|
||||
tcl_file.write(line2output)
|
||||
|
||||
tcl_file.close()
|
||||
logging.debug("Done")
|
||||
|
||||
#####################################################################
|
||||
# Run Design Compiler
|
||||
#####################################################################
|
||||
curr_dir = os.getcwd()
|
||||
# Change to the project directory
|
||||
os.chdir(project_abs_path)
|
||||
logging.debug("Changed to directory: " + project_abs_path)
|
||||
|
||||
# Run Design Compiler
|
||||
dc_log_file_path = project_abs_path + "/" + os.path.basename(rtl_design_name) + "_dc.log"
|
||||
dc_shell_bin = "dc_shell"
|
||||
dc_shell_cmd = dc_shell_bin + " -f " + os.path.abspath(tcl_file_path) + " > " + dc_log_file_path
|
||||
logging.debug("Running Design Compiler by : " + dc_shell_cmd)
|
||||
subprocess.run(dc_shell_cmd, shell=True, check=True)
|
||||
|
||||
# Go back to current directory
|
||||
os.chdir(curr_dir)
|
||||
|
||||
#####################################################################
|
||||
# Main function of this script, so that it can be called by other scripts
|
||||
#####################################################################
|
||||
def run_dc_batch_synth(rtl_netlist, recipe_template, technology_library, project_workspace):
|
||||
#####################################################################
|
||||
# Check options:
|
||||
# - Input files must be valid
|
||||
# Otherwise, error out
|
||||
#####################################################################
|
||||
if not isfile(rtl_netlist):
|
||||
logging.error("Invalid RTL netlist: " + rtr_netlist + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
if not isfile(recipe_template):
|
||||
logging.error("Invalid recipe template: " + recipe_template + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
if not isfile(technology_library):
|
||||
logging.error("Invalid technology library: " + technology_library + "\nFile does not exist!\n")
|
||||
exit(1)
|
||||
|
||||
#####################################################################
|
||||
# Collect all the RTL designs to synthesis from the RTL netlist
|
||||
#####################################################################
|
||||
rtl_design_names = []
|
||||
with open(rtl_netlist, "r") as wp:
|
||||
rtl_file = wp.readlines()
|
||||
# If a line starts with 'module', it is an RTL design to be synthesized
|
||||
for line_num, curr_line in enumerate(rtl_file):
|
||||
if (curr_line.startswith("module")):
|
||||
# Get the design name
|
||||
rtl_design_name = re.findall("module(\s+)(\w+)\(", curr_line)[0][1]
|
||||
rtl_design_names.append(rtl_design_name)
|
||||
|
||||
logging.info("Found " + str(len(rtl_design_names)) + " RTL designs to synthesize")
|
||||
|
||||
# Get absolute path to the template tcl script, it must be valid
|
||||
rtl_netlist_abs_path = os.path.abspath(rtl_netlist)
|
||||
assert(isfile(rtl_netlist_abs_path))
|
||||
|
||||
for rtl_design_name in rtl_design_names:
|
||||
logging.info("Running Design Compiler for design: " + rtl_design_name)
|
||||
run_dc_synth(rtl_netlist_abs_path, rtl_design_name, recipe_template, technology_library, project_workspace)
|
||||
logging.info("Done")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
|
@ -0,0 +1 @@
|
|||
python3 SCRIPTS/run_dc_synth.py --rtl_netlist ../HDL/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/SRC/sub_module/local_encoder.v --recipe_template SCRIPTS/dc_template.tcl --technology_library ../PDK/skywater-pdk/vendor/synopsys/results/lib/sky130_fd_sc_hd/db_nldm/sky130_fd_sc_hd__tt_025C_1v80.db --project_workspace ./TEMP
|
BIN
TESTBENCH/common/post_pnr_fpga_cells.v (Stored with Git LFS)
BIN
TESTBENCH/digital_io_hd_test/digital_io_hd_test_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_latch_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_latch_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_or2_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_or2_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/and2_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/ccff_test_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/ccff_test_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/counter_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/routing_test_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/routing_test_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/scff_test_post_pnr_include_netlists.v (Stored with Git LFS)
Normal file
BIN
TESTBENCH/k4_N8_reset_softadder_caravel_io_FPGA_12x12_customhd_cc/postpnr/verilog_testbench/scff_test_post_pnr_wrapper_include_netlists.v (Stored with Git LFS)
Normal file
|
@ -0,0 +1,2 @@
|
|||
envyaml==1.0.201125
|
||||
humanize==3.1.0
|