mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<html><head>
 | 
						|
<title>YosysJS Example Application #02</title>
 | 
						|
<script type="text/javascript" src="yosysjs.js"></script>
 | 
						|
<script src="http://wavedrom.com/skins/default.js" type="text/javascript"></script>
 | 
						|
<script src="http://wavedrom.com/WaveDrom.js" type="text/javascript"></script>
 | 
						|
<style type="text/css">
 | 
						|
.noedit { color: #666; }
 | 
						|
</style>
 | 
						|
<script id="golden_verilog" type="text/plain">
 | 
						|
module ref(input clk, reset, input [7:0] A, output reg [7:0] Y);
 | 
						|
	always @(posedge clk) begin
 | 
						|
		if (reset)
 | 
						|
			Y <= 0;
 | 
						|
		else
 | 
						|
			Y <= ((Y << 5) + Y) ^ A;
 | 
						|
	end
 | 
						|
endmodule
 | 
						|
</script>
 | 
						|
</head><body>
 | 
						|
	<div id="popup" style="position: fixed; left: 0; top: 0; width:100%; height:100%; text-align:center; z-index: 1000;
 | 
						|
		background-color: rgba(100, 100, 100, 0.5);"><div style="width:300px; margin: 200px auto; background-color: #88f;
 | 
						|
		border:3px dashed #000; padding:15px; text-align:center;"><span id="popupmsg">Loading...</span></div>
 | 
						|
	</div>
 | 
						|
	<h1>YosysJS Example Application #03</h1>
 | 
						|
	<b>Your mission:</b> Create a behavioral Verilog model for the following circuit:
 | 
						|
	<p/>
 | 
						|
	<div id="main" style="visibility: hidden">
 | 
						|
		<svg id="schem" width="800"></svg>
 | 
						|
		<p/>
 | 
						|
		<pre id="code" style="width: 800px; border:2px solid #000; padding: 0.5em;"><span class="noedit">module top(input clk, reset, input [7:0] A, output reg [7:0] Y);
 | 
						|
  always @(posedge clock) begin</span><span class="edit" contenteditable="true">
 | 
						|
    Y <= A | {4{reset}};
 | 
						|
  </span><span class="noedit">end
 | 
						|
endmodule</span></pre><p/>
 | 
						|
		<input type="button" value="Check Model" onclick="check_model()"> <span id="checkmessage"></span>
 | 
						|
		<p/>
 | 
						|
		<p id="wave"> </p>
 | 
						|
	</div>
 | 
						|
	<script type="text/javascript">
 | 
						|
		function on_ys_ready() {
 | 
						|
			ys.write_file('golden.v', document.getElementById('golden_verilog').textContent);
 | 
						|
			ys.run('echo on; read_verilog golden.v; proc;;');
 | 
						|
			ys.run('show -notitle -width -stretch');
 | 
						|
			YosysJS.dot_into_svg(ys.read_file('show.dot'), 'schem');
 | 
						|
			document.getElementById('popup').style.visibility = 'hidden';
 | 
						|
			document.getElementById('popupmsg').textContent = 'Please wait..';
 | 
						|
			document.getElementById('main').style.visibility = 'visible';
 | 
						|
		}
 | 
						|
		function check_model() {
 | 
						|
			function work() {
 | 
						|
				ys.remove_file('wave.json');
 | 
						|
				ys.write_file('code.v', document.getElementById('code').textContent);
 | 
						|
				ys.errmsg = '';
 | 
						|
				ys.run('design -reset; read_verilog code.v; hierarchy -top top; proc; opt; flatten; hierarchy; ' +
 | 
						|
					'read_verilog golden.v; proc; miter -equiv -ignore_gold_x -make_outputs -flatten ref top miter; ' +
 | 
						|
					'hierarchy -top miter; clean -purge; sat -set-init-undef -seq 8 -dump_json wave.json -show-ports ' +
 | 
						|
					'-max_undef -prove trigger 0 miter');
 | 
						|
				w = document.getElementById('wave')
 | 
						|
				if (ys.errmsg) {
 | 
						|
					w.innerHTML = '<b><pre>ERROR: ' + ys.errmsg.replace('&', '&').replace('<', '<').replace('>', '>') + '</pre></b>';
 | 
						|
				} else {
 | 
						|
					wdata = ys.read_file('wave.json');
 | 
						|
					if (wdata) {
 | 
						|
						wdata = JSON.parse(wdata);
 | 
						|
						function wsignal(signame, newname) {
 | 
						|
							for (i = 0; i < wdata["signal"].length; i++)
 | 
						|
								if (wdata["signal"][i].name == signame) {
 | 
						|
									if (newname)
 | 
						|
										wdata["signal"][i].name = newname;
 | 
						|
									return wdata["signal"][i];
 | 
						|
								}
 | 
						|
							return {};
 | 
						|
						}
 | 
						|
						wdata2 = {
 | 
						|
							"signal" : [
 | 
						|
								{ name: 'clk', wave: 'P........' },
 | 
						|
								wsignal("trigger"),
 | 
						|
								{},
 | 
						|
								[ "Inputs", wsignal("in_reset", "reset"), wsignal("in_A", "A") ],
 | 
						|
								{},
 | 
						|
								[ "Y Output", wsignal("gold_Y", "Ref"), wsignal("gate_Y", "UUT") ],
 | 
						|
							],
 | 
						|
							"config" : wdata["config"]
 | 
						|
						};
 | 
						|
						wdata2 = JSON.stringify(wdata2)
 | 
						|
						w.innerHTML = '<b>The model did not pass verification:</b><p/>' +
 | 
						|
								'<script type="WaveDrom">' + wdata2 + '<\/script>';
 | 
						|
						WaveDrom.ProcessAll();
 | 
						|
					} else {
 | 
						|
						w.innerHTML = '<b>Congratulations! The model did pass verification.</b><p/>';
 | 
						|
					}
 | 
						|
				}
 | 
						|
				document.getElementById('popup').style.visibility = 'hidden';
 | 
						|
			}
 | 
						|
			document.getElementById('popup').style.visibility = 'visible';
 | 
						|
			window.setTimeout(work, 100);
 | 
						|
		}
 | 
						|
 | 
						|
		YosysJS.load_viz();
 | 
						|
		var ys = YosysJS.create('', on_ys_ready);
 | 
						|
		ys.logprint = true;
 | 
						|
	</script>
 | 
						|
</body></html>
 |