Download index.html from getreadystack/yosys-migration-check: direct link, hf CLI and curl.
- Browser
- Download file 39.5 kB
-
https://huggingface.co/spaces/getreadystack/yosys-migration-check/resolve/main/index.html
- Command line
-
hf download hf://spaces/getreadystack/yosys-migration-check/index.html
-
curl -L -o index.html https://huggingface.co/spaces/getreadystack/yosys-migration-check/resolve/main/index.html
39.5 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Yosys Vivado Migration — check your code for free</title> | |
| <meta name="description" content="This free tool finds Vivado-only macros, IP instances, encrypted IP, debug cores and glbl references in Verilog and SystemVerilog."> | |
| <style> | |
| :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512} | |
| .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px} | |
| textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box} | |
| .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer} | |
| input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px} | |
| table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65} | |
| .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600} | |
| .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa} | |
| </style> | |
| <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script> | |
| <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/yosys-migration-check"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:anywhere}#out pre,#out code{white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width:640px){table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <h1>Yosys Vivado Migration — check your code for free</h1> | |
| <p class="lede">Yosys migration check for Verilog/SystemVerilog: flags Vivado-only XPM macros, IP-core instances, encrypted IP, ILA/VIO debug cores and glbl references before you leave a Vivado licence. Runs entirely in your browser — nothing is uploaded.</p> | |
| <textarea id="src" spellcheck="false">// top.v — board top ported from a Vivado 2025.2 project | |
| `timescale 1ns / 1ps | |
| module top ( | |
| input wire sys_clk_p, | |
| input wire sys_clk_n, | |
| input wire rst_n, | |
| input wire [7:0] din, | |
| output wire [7:0] dout | |
| ); | |
| wire clk, locked, sync_rst; | |
| clk_wiz_0 u_clk (.clk_in1_p(sys_clk_p), .clk_in1_n(sys_clk_n), .clk_out1(clk), .locked(locked)); | |
| xpm_cdc_single #(.DEST_SYNC_FF(4)) u_rst_sync (.src_clk(1'b0), .src_in(~rst_n), .dest_clk(clk), .dest_out(sync_rst)); | |
| (* mark_debug = "true" *) reg [7:0] pipe; | |
| xpm_memory_sdpram #(.MEMORY_SIZE(2048), .READ_DATA_WIDTH_B(8), .WRITE_DATA_WIDTH_A(8)) u_ram ( | |
| .clka(clk), .clkb(clk), .ena(1'b1), .enb(1'b1), .wea(1'b1), | |
| .addra(pipe), .addrb(din), .dina(din), .doutb(dout) | |
| ); | |
| always @(posedge clk) begin | |
| if (sync_rst) pipe <= 8'd0; | |
| else pipe <= pipe + 8'd1; | |
| end | |
| ila_0 u_ila (.clk(clk), .probe0(pipe), .probe1(dout)); | |
| `pragma protect begin_protected | |
| `pragma protect key_keyowner = "Xilinx", key_method = "rsa" | |
| `pragma protect end_protected | |
| endmodule</textarea> | |
| <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div> | |
| <div id="out" aria-live="polite"></div> | |
| <div id="paid"><strong>Free here:</strong> Scan the open Verilog/SystemVerilog file and list every Vivado-only blocker with its line and the Yosys-ready fix.. <strong>In the editor:</strong> Workspace-wide scan of every .v/.sv file in the repo plus an exportable Markdown migration report per blocker, to hand to the team before the Vivado licence renewal. — that part asks for a licence key.</div> | |
| <p class="note">Same engine as the VS Code extension, byte for byte.</p> | |
| </div> | |
| <script>var YOSYS_RULES = [ | |
| {"id": "XPM_CDC", "sev": "error", "re": "\\bxpm_cdc_(single|array_single|gray|handshake|pulse|async_rst|sync_rst)\\b", "msg": "Vivado XPM CDC macro — the module ships inside the Vivado install, Yosys has no definition for it", "fix": "own 2-flop synchroniser module"}, | |
| {"id": "XPM_MEMORY", "sev": "error", "re": "\\bxpm_memory_(spram|sdpram|tdpram|dpdistram|sprom|dprom)\\b", "msg": "Vivado XPM memory macro — not part of Yosys; the design fails with a missing-module error", "fix": "inferred reg array RAM"}, | |
| {"id": "XPM_FIFO", "sev": "error", "re": "\\bxpm_fifo_(sync|async|axis)\\b", "msg": "Vivado XPM FIFO macro — not part of Yosys", "fix": "own FIFO module in RTL"}, | |
| {"id": "ENCRYPTED_IP", "sev": "error", "re": "`(pragma\\s+)?protect\\s+begin_protected\\b", "msg": "IEEE 1735 encrypted block — only the vendor tool holds the key, Yosys cannot read it", "fix": "get plain RTL or rewrite"}, | |
| {"id": "VIVADO_IP_INSTANCE", "sev": "error", "re": "^\\s*(clk_wiz|fifo_generator|blk_mem_gen|dist_mem_gen|xadc_wiz|mig_7series|proc_sys_reset|processing_system7|zynq_ultra_ps_e|util_ds_buf|c_counter_binary|c_shift_ram|mult_gen|div_gen|cordic|dds_compiler|fir_compiler|axi_[a-z0-9_]+?)_\\d+\\b", "msg": "Vivado IP-core instance — its netlist is generated from a .xci inside Vivado and is not in your RTL sources", "fix": "RTL or primitive instance"}, | |
| {"id": "DEBUG_CORE", "sev": "warn", "re": "^\\s*(ila|vio|system_ila)_\\d+\\b", "msg": "Vivado ILA/VIO debug core instance — generated by Vivado, an open flow has nothing to bind it to", "fix": "wrap in `ifdef VIVADO_DEBUG"}, | |
| {"id": "MARK_DEBUG", "sev": "warn", "re": "\\(\\*[^*]*\\bmark_debug\\b", "msg": "mark_debug attribute — Vivado inserts an ILA probe from it; Yosys keeps it as a plain attribute and inserts nothing", "fix": "drop or keep as note"}, | |
| {"id": "DONT_TOUCH", "sev": "warn", "re": "\\(\\*[^*]*\\bdont_touch\\b", "msg": "DONT_TOUCH is a Vivado attribute; the attribute Yosys documents for keeping a cell is (* keep *)", "fix": "add (* keep *) next to it"}, | |
| {"id": "GLBL_REF", "sev": "error", "re": "\\bglbl\\.(GSR|GTS|PRLD)\\b", "msg": "hierarchical reference into Vivado's glbl simulation module — not a synthesisable signal", "fix": "explicit reset port"}, | |
| {"id": "SV_CLASS", "sev": "error", "re": "^\\s*(virtual\\s+)?class\\s+[A-Za-z_]\\w*", "msg": "SystemVerilog class — Yosys read_verilog -sv does not parse classes", "fix": "move file out of Yosys read list"}, | |
| {"id": "SV_COVERGROUP", "sev": "error", "re": "^\\s*covergroup\\s+[A-Za-z_]\\w*", "msg": "SystemVerilog covergroup — testbench-only construct, Yosys does not parse it", "fix": "move file out of Yosys read list"}, | |
| {"id": "VIVADO_PROJECT_PATH", "sev": "warn", "re": "[\\w.-]+\\.(srcs|gen|runs|ip_user_files)/", "msg": "path points into a Vivado-generated project folder that does not exist outside Vivado", "fix": "repo-relative path"} | |
| ] | |
| ;</script> | |
| <script>// Yosys migration check engine: finds Vivado-only constructs in Verilog/SystemVerilog. | |
| // Same file runs in node (VS Code) and in the browser (web page). | |
| (function () { | |
| var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.YOSYS_RULES; | |
| var COMPILED = RULES.map(function (r) { return { rule: r, re: new RegExp(r.re, 'i') }; }); | |
| // Blank out // and /* */ comments but keep line numbers, so a comment that names | |
| // xpm_cdc_single does not count. `pragma / `protect directives are not comments. | |
| function stripComments(text) { | |
| var out = '', i = 0, n = text.length, inStr = false; | |
| while (i < n) { | |
| var c = text[i], d = text[i + 1]; | |
| if (inStr) { out += c; if (c === '\\') { out += d || ''; i += 2; continue; } if (c === '"') inStr = false; i++; continue; } | |
| if (c === '"') { inStr = true; out += c; i++; continue; } | |
| if (c === '/' && d === '/') { while (i < n && text[i] !== '\n') { out += ' '; i++; } continue; } | |
| if (c === '/' && d === '*') { | |
| i += 2; out += ' '; | |
| while (i < n && !(text[i] === '*' && text[i + 1] === '/')) { out += text[i] === '\n' ? '\n' : ' '; i++; } | |
| i += 2; out += ' '; continue; | |
| } | |
| out += c; i++; | |
| } | |
| return out; | |
| } | |
| function check(text, opts) { | |
| opts = opts || {}; | |
| var src = stripComments(String(text || '').replace(/\r\n?/g, '\n')); | |
| var lines = src.split('\n'); | |
| var findings = []; | |
| for (var li = 0; li < lines.length; li++) { | |
| var line = lines[li].replace(/[\t\f\v ]+/g, ' '); | |
| if (!line.trim()) continue; | |
| for (var k = 0; k < COMPILED.length; k++) { | |
| var m = COMPILED[k].re.exec(line); | |
| if (!m) continue; | |
| var r = COMPILED[k].rule; | |
| findings.push({ check: r.id, sev: r.sev, line: li + 1, | |
| msg: m[0].trim() + ': ' + r.msg + ' → ' + r.fix }); | |
| } | |
| } | |
| return { findings: findings }; | |
| } | |
| var api = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = api; | |
| if (typeof window !== 'undefined') window.YOSYSENGINE = api; | |
| })(); | |
| </script> | |
| <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다. | |
| ; | |
| function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); } | |
| function summaryLine(res) { | |
| const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length; | |
| return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.'; | |
| } | |
| function toText(res, label) { | |
| const f = (res && res.findings) || []; | |
| const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)]; | |
| f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); }); | |
| return lines.join('\n'); | |
| } | |
| function toHtml(res) { | |
| const f = (res && res.findings) || []; | |
| if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>'; | |
| const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join(''); | |
| return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>'; | |
| } | |
| var YOSYSREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = YOSYSREPORT; | |
| else window.YOSYSREPORT = YOSYSREPORT; | |
| </script> | |
| <script> | |
| (function(){ | |
| var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today'); | |
| today.value=new Date().toISOString().slice(0,10); | |
| function run(){ try { var res=window.YOSYSENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.YOSYSREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } } | |
| go.onclick=run; if (src.value.trim()) run(); | |
| })(); | |
| </script> | |
| <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/yosys-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'yosys-migration-check',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section> | |
| <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind Yosys Migration Check - Vivado-only blockers every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"yosys-migration-check",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section> | |
| <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Workspace-wide scan of every .v/.sv file plus an exportable Markdown migration report per blocker, for the team before the Vivado licence renewal.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Vivado CORE tier: $1,200 per node-locked seat per year from 2026.1 (AMD); ENTERPRISE $4,395 perpetual</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_n8pA9qejKh7489cvHjUX1GBWNXjSltzkXFLgw4arQ52" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section> | |
| <!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script> | |
| <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script> | |
| <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-30">Updated 2026-09-30</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-30","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku395161_result_card.jpg" alt="Migrate from AMD Vivado to Yosys: the 6 lines that stop the first run" loading="lazy" style="max-width:100%;border-radius:6px"></p> | |
| <p>Yosys migration check found 6 findings in one Vivado board top, the kind of top.v an FPGA engineer in the US or EU carries out of a Vivado project: a clk_wiz_0 IP instance, an xpm_cdc_single macro, a mark_debug attribute, an xpm_memory_sdpram macro, an ila_0 debug core and a `pragma protect encrypted block.</p> | |
| <h3>What AMD changed, and when</h3> | |
| <p>Starting with the Vivado 2026.1 release (June 2026), AMD moved the Vivado Design Suite to tiered licensing. According to AMD's licensing page, BASIC is a free, annually renewed subscription with limited simulation and debug support. CORE is $1,200 per node-locked seat per year ($1,800 floating). PRO is $2,400 node-locked. ENTERPRISE stays a $4,395 perpetual licence. From 2026.1 on, only PRO, ENTERPRISE and GOLD include access to Vivado versions older than 2026.1; BASIC and CORE users keep their old licence file to use older versions.</p> | |
| <p>That is the renewal moment when a team asks how much of its RTL could go through open-source Yosys instead.</p> | |
| <h3>Why the first Yosys run is a bad inventory</h3> | |
| <p>Run <code>yosys -p "read_verilog -sv top.v; synth_xilinx"</code> on a file that grew up inside Vivado and it stops at the first module Yosys has never heard of. Fix that one, run again, and it stops at the next. Two lines never stop it at all: <code>(* mark_debug = "true" *)</code> and <code>(* DONT_TOUCH = "yes" *)</code> are Vivado behaviour, and when the flow changes they simply stop doing anything.</p> | |
| <p>A chatbot will happily list "Vivado features Yosys lacks", but it answers from memory and never sees your file.</p> | |
| <h3>The sample file, line by line</h3> | |
| <p>The check reads the file as text, blanks out comments (so <code>// replaced xpm_cdc_single</code> does not count) and applies 12 rules. On <code>_fixtures/dirty.v</code>:</p> | |
| <table><thead><tr><th>Vivado-only line</th><th>Yosys-ready fix</th></tr></thead><tbody><tr><td>clk_wiz_0 u_clk</td><td>RTL or primitive instance</td></tr><tr><td>xpm_cdc_single</td><td>own 2-flop synchroniser module</td></tr><tr><td>(* mark_debug *)</td><td>drop or keep as note</td></tr><tr><td>xpm_memory_sdpram</td><td>inferred reg array RAM</td></tr><tr><td>ila_0 u_ila</td><td>wrap in ifdef VIVADO_DEBUG</td></tr><tr><td>`pragma protect begin_protected</td><td>get plain RTL or rewrite</td></tr></tbody></table> | |
| <p>The XPM macros are SystemVerilog modules that ship inside the Vivado install, so outside Vivado there is no definition to read. clk_wiz_0 and ila_0 are generated from .xci files by Vivado; the RTL in your repo only holds the instance. An IEEE 1735 protect block can only be opened by the tool that holds the key.</p> | |
| <p>The ported file, <code>_fixtures/clean.v</code>, replaces the synchroniser with a two-flop module the team owns, infers the RAM from a reg array and marks the flop with <code>(* keep *)</code>. It gives 0 findings.</p> | |
| <h3>The 12 rules</h3> | |
| <p>XPM_CDC, XPM_MEMORY, XPM_FIFO, ENCRYPTED_IP, VIVADO_IP_INSTANCE, DEBUG_CORE, MARK_DEBUG, DONT_TOUCH, GLBL_REF (references into Vivado's glbl simulation module), SV_CLASS and SV_COVERGROUP (testbench constructs Yosys does not parse) and VIVADO_PROJECT_PATH (paths into project.srcs/, .gen/, .runs/ or .ip_user_files/).</p> | |
| <h3>Try it on your own file</h3> | |
| <p>Paste a .v or .sv file into the free web page, or open it in VS Code and run the scan from the command palette. The free scan covers the open file with every blocker, its line and its fix. The full version scans every Verilog file in the workspace and exports a Markdown migration report per blocker for the team.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku395161_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku395161_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Yosys Migration Check do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a Verilog or SystemVerilog file and flags every line that only works inside AMD Vivado, using 12 rules. On the sample Vivado board top it gives 6 findings: a clk_wiz_0 IP instance, an xpm_cdc_single macro, a mark_debug attribute, an xpm_memory_sdpram macro, an ila_0 debug core and a pragma protect encrypted block. Each finding comes with a Yosys-ready fix.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is Yosys Migration Check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">FPGA and RTL engineers in the US and EU who are moving some synthesis from AMD Vivado to open-source Yosys, for example after the Vivado 2026.1 tiered licensing change. It suits a team lead sizing the port, a contractor quoting it, or an engineer checking one module before the next Vivado licence renewal.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just run Yosys or ask a chatbot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A Yosys run stops at the first missing module, such as xpm_cdc_single, and says nothing about the next blockers in the file. It also stays quiet about mark_debug and DONT_TOUCH, which are Vivado behaviour that simply disappears. A chatbot answers from memory and does not see your file. This check lists every Vivado-only line at once.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what does the full version add?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free: scan the open .v or .sv file and see every Vivado-only blocker with its line number and a Yosys-ready fix, no key and no account, and the file stays on your machine. The full version, 29 dollars once, scans every Verilog file in the workspace and exports a Markdown migration report per blocker for the team.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does staying on a Vivado licence cost?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">From Vivado 2026.1, AMD lists the CORE tier at $1,200 per node-locked seat per year and $1,800 floating, PRO at $2,400 node-locked, and ENTERPRISE at $4,395 perpetual. BASIC is free with limited simulation and debug support. Knowing which files are Vivado-only tells you how much RTL can move to Yosys before that renewal.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Yosys Migration Check do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a Verilog or SystemVerilog file and flags every line that only works inside AMD Vivado, using 12 rules. On the sample Vivado board top it gives 6 findings: a clk_wiz_0 IP instance, an xpm_cdc_single macro, a mark_debug attribute, an xpm_memory_sdpram macro, an ila_0 debug core and a pragma protect encrypted block. Each finding comes with a Yosys-ready fix."}}, {"@type": "Question", "name": "Who is Yosys Migration Check for?", "acceptedAnswer": {"@type": "Answer", "text": "FPGA and RTL engineers in the US and EU who are moving some synthesis from AMD Vivado to open-source Yosys, for example after the Vivado 2026.1 tiered licensing change. It suits a team lead sizing the port, a contractor quoting it, or an engineer checking one module before the next Vivado licence renewal."}}, {"@type": "Question", "name": "Why not just run Yosys or ask a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "A Yosys run stops at the first missing module, such as xpm_cdc_single, and says nothing about the next blockers in the file. It also stays quiet about mark_debug and DONT_TOUCH, which are Vivado behaviour that simply disappears. A chatbot answers from memory and does not see your file. This check lists every Vivado-only line at once."}}, {"@type": "Question", "name": "What is free and what does the full version add?", "acceptedAnswer": {"@type": "Answer", "text": "Free: scan the open .v or .sv file and see every Vivado-only blocker with its line number and a Yosys-ready fix, no key and no account, and the file stays on your machine. The full version, 29 dollars once, scans every Verilog file in the workspace and exports a Markdown migration report per blocker for the team."}}, {"@type": "Question", "name": "What does staying on a Vivado licence cost?", "acceptedAnswer": {"@type": "Answer", "text": "From Vivado 2026.1, AMD lists the CORE tier at $1,200 per node-locked seat per year and $1,800 floating, PRO at $2,400 node-locked, and ENTERPRISE at $4,395 perpetual. BASIC is free with limited simulation and debug support. Knowing which files are Vivado-only tells you how much RTL can move to Yosys before that renewal."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:395161,slug:"yosys-migration-check",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/firestore-rules-guard"><span class="yj-rel-t">Firestore Rules Guard</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/ghdl-migration-check"><span class="yj-rel-t">GHDL Migration Check — Vivado xsim to GHDL</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/vscodium-extension-licence-lint"><span class="yj-rel-t">VSCodium Migration Lint: Microsoft-only Extensions</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/robots-txt-ai-crawler-audit"><span class="yj-rel-t">AI Crawler Rules - robots.txt Audit for AI Search</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/almalinux-migration-lint"><span class="yj-rel-t">AlmaLinux Migration Lint — CentOS 7/8</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/brave-search-api-migration-check"><span class="yj-rel-t">Brave Search API Migration Check — Google Custom Search & Bing</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body> | |
| </html> | |