diff options
Diffstat (limited to 'misc/yosysjs/demo03.html')
| -rw-r--r-- | misc/yosysjs/demo03.html | 103 | 
1 files changed, 103 insertions, 0 deletions
diff --git a/misc/yosysjs/demo03.html b/misc/yosysjs/demo03.html new file mode 100644 index 000000000..720b82e90 --- /dev/null +++ b/misc/yosysjs/demo03.html @@ -0,0 +1,103 @@ +<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/> +	<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> +	<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..'; +		} +		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) { +						console.log(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) +						console.log(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; +		ys.echo = true; +	</script> +</body></html>  | 
