Merge remote-tracking branch 'origin/master' into ganesh_dev

This commit is contained in:
Ganesh Gore 2020-12-14 14:14:22 -07:00
commit 06e220d7e4
54 changed files with 3627 additions and 1932 deletions

2
.gitattributes vendored
View File

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

View File

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

View File

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

View File

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

View File

@ -7,3 +7,5 @@
sofa_hd/index
qlsofa_hd/index
sofa_chd/index

View File

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

View File

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

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 72 KiB

View File

@ -1,4 +1,4 @@
.. _datasheet_sofa_hd:
.. _datasheet_qlsofa_hd:
QLSOFA HD
QLSOFA HD

View File

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

View File

@ -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`.

View File

@ -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.

View File

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

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 86 KiB

View File

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

View File

@ -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.

View File

@ -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`.

View File

@ -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`.

View File

@ -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`.

View File

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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 86 KiB

View File

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 KiB

View File

@ -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.

View File

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

View File

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

View File

@ -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"

View File

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

View File

@ -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));

View File

@ -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")

View File

@ -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:])

10
SNPS_DC/README.md Normal file
View File

@ -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.

View File

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

View File

@ -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:])

View File

@ -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/caravel_fpga_io_test_include_netlists.v (Stored with Git LFS) Normal file

Binary file not shown.

BIN
TESTBENCH/common/post_pnr_fpga_cells.v (Stored with Git LFS)

Binary file not shown.

BIN
TESTBENCH/digital_io_hd_test/digital_io_hd_test.v (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
envyaml==1.0.201125
humanize==3.1.0