mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-12-22 12:30:01 +00:00
added more verilog test cases
This commit is contained in:
parent
73e908256e
commit
aad8efcfec
@ -66,8 +66,9 @@ function translateFunction(text) {
|
|||||||
var funcname = text.match(/(\w+)/)[1];
|
var funcname = text.match(/(\w+)/)[1];
|
||||||
text = text.replace(symsName + "* __restrict ", "");
|
text = text.replace(symsName + "* __restrict ", "");
|
||||||
text = text.replace(moduleName + "* __restrict vlTOPp VL_ATTR_UNUSED", "var vlTOPp");
|
text = text.replace(moduleName + "* __restrict vlTOPp VL_ATTR_UNUSED", "var vlTOPp");
|
||||||
text = text.replace(/VL_DEBUG_IF/g,"//VL_DEBUG_IF");
|
text = text.replace(/\bVL_DEBUG_IF\(([^]+?)\);\n/g,"/*VL_DEBUG_IF($1);*/\n");
|
||||||
text = text.replace(/VL_SIG(\d*)[(](\w+),(\d+),(\d+)[)]/g, 'var $2');
|
//text = text.replace(/\bVL_DEBUG_IF/g,"!__debug__?0:\n");
|
||||||
|
text = text.replace(/\bVL_SIG(\d*)[(](\w+),(\d+),(\d+)[)]/g, 'var $2');
|
||||||
text = text.replace(/\b->\b/g, ".");
|
text = text.replace(/\b->\b/g, ".");
|
||||||
text = text.replace('VL_INLINE_OPT', '');
|
text = text.replace('VL_INLINE_OPT', '');
|
||||||
text = text.replace(/[(]IData[)]/g, '');
|
text = text.replace(/[(]IData[)]/g, '');
|
||||||
@ -83,6 +84,7 @@ function translateFunction(text) {
|
|||||||
text = text.replace(/VL_LIKELY/g, '!!');
|
text = text.replace(/VL_LIKELY/g, '!!');
|
||||||
text = text.replace(/VL_UNLIKELY/g, '!!');
|
text = text.replace(/VL_UNLIKELY/g, '!!');
|
||||||
text = text.replace(/Verilated::(\w+)Error/g, 'console.log');
|
text = text.replace(/Verilated::(\w+)Error/g, 'console.log');
|
||||||
|
text = text.replace(/vlSymsp.name[(][)]/g, '"'+moduleName+'"');
|
||||||
return "function " + text + "\nself." + funcname + " = " + funcname + ";\n";
|
return "function " + text + "\nself." + funcname + " = " + funcname + ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,28 +133,3 @@ function translateVerilatorOutputToJS(htext, cpptext) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
// TODO: unit test
|
|
||||||
/*
|
|
||||||
incpp = "obj_dir/Vhvsync_generator.cpp"
|
|
||||||
inh = "obj_dir/Vhvsync_generator.h"
|
|
||||||
|
|
||||||
fs = require('fs')
|
|
||||||
fs.readFile(incpp, 'utf8', function (err,datacpp) {
|
|
||||||
fs.readFile(inh, 'utf8', function (err,datah) {
|
|
||||||
var modtext = translateVerilatorOutputToJS(datah, datacpp);
|
|
||||||
console.log(modtext);
|
|
||||||
var mod = new Function('base',modtext);
|
|
||||||
var gen = new mod(new VerilatorBase());
|
|
||||||
console.log(gen);
|
|
||||||
gen._ctor_var_reset();
|
|
||||||
var top = {TOPp:gen};
|
|
||||||
gen._eval_settle(top);
|
|
||||||
for (var i=0; i<1000000; i++)
|
|
||||||
gen._eval(top);
|
|
||||||
console.log(gen);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
@ -11,8 +11,9 @@ function loadPlatform(msg) {
|
|||||||
try {
|
try {
|
||||||
platform.loadROM("ROM", msg.output);
|
platform.loadROM("ROM", msg.output);
|
||||||
vl_finished = vl_stopped = false;
|
vl_finished = vl_stopped = false;
|
||||||
for (var i=0; i<100 && !(vl_finished||vl_stopped); i++)
|
for (var i=0; i<10000 && !(vl_finished||vl_stopped); i++)
|
||||||
platform.tick();
|
platform.tick();
|
||||||
|
//assert.ok(vl_finished||vl_stopped);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//platform.printErrorCodeContext(e, msg.output.code);
|
//platform.printErrorCodeContext(e, msg.output.code);
|
||||||
console.log(msg.intermediate.listing);
|
console.log(msg.intermediate.listing);
|
||||||
@ -49,6 +50,24 @@ function testVerilator(filename, disables, nerrors) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('Verilog Worker', function() {
|
describe('Verilog Worker', function() {
|
||||||
|
testVerilator('test/cli/verilog/t_gen_alw.v');
|
||||||
|
testVerilator('test/cli/verilog/t_case_huge_sub3.v');
|
||||||
|
|
||||||
|
//testVerilator('test/cli/verilog/t_order.v');
|
||||||
|
//testVerilator('test/cli/verilog/t_order_2d.v');
|
||||||
|
//testVerilator('test/cli/verilog/t_order_a.v');
|
||||||
|
//testVerilator('test/cli/verilog/t_order_b.v');
|
||||||
|
//testVerilator('test/cli/verilog/t_order_clkinst.v');
|
||||||
|
testVerilator('test/cli/verilog/t_order_comboclkloop.v');
|
||||||
|
//testVerilator('test/cli/verilog/t_order_comboloop.v', ['BLKSEQ']);
|
||||||
|
testVerilator('test/cli/verilog/t_order_doubleloop.v', ['BLKSEQ']);
|
||||||
|
testVerilator('test/cli/verilog/t_order_first.v');
|
||||||
|
testVerilator('test/cli/verilog/t_order_loop_bad.v', ['BLKSEQ'], 10);
|
||||||
|
testVerilator('test/cli/verilog/t_order_multialways.v');
|
||||||
|
testVerilator('test/cli/verilog/t_order_multidriven.v', ['UNDRIVEN']);
|
||||||
|
//testVerilator('test/cli/verilog/t_order_quad.v');
|
||||||
|
testVerilator('test/cli/verilog/t_order_wireloop.v', ['UNOPT']);
|
||||||
|
|
||||||
testVerilator('test/cli/verilog/t_mem.v');
|
testVerilator('test/cli/verilog/t_mem.v');
|
||||||
|
|
||||||
testVerilator('test/cli/verilog/t_alw_combdly.v');
|
testVerilator('test/cli/verilog/t_alw_combdly.v');
|
||||||
|
291
test/cli/verilog/t_case_huge_sub3.v
Normal file
291
test/cli/verilog/t_case_huge_sub3.v
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2005 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t_case_huge_sub3 (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
outr,
|
||||||
|
// Inputs
|
||||||
|
clk, index
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input [9:0] index;
|
||||||
|
output [3:0] outr;
|
||||||
|
|
||||||
|
// =============================
|
||||||
|
/*AUTOREG*/
|
||||||
|
// Beginning of automatic regs (for this module's undeclared outputs)
|
||||||
|
reg [3:0] outr;
|
||||||
|
// End of automatics
|
||||||
|
|
||||||
|
// =============================
|
||||||
|
// Created from perl
|
||||||
|
//for $i (0..255) { $r=rand(4); printf "\t8'h%02x: begin outr <= outr^index[8:5]^4'h%01x; end\n", $i,
|
||||||
|
//rand(256); };
|
||||||
|
|
||||||
|
// Reset cheating
|
||||||
|
initial outr = 4'b0;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
case (index[7:0])
|
||||||
|
8'h00: begin outr <= 4'h0; end
|
||||||
|
8'h01: begin /*No Change*/ end
|
||||||
|
8'h02: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h03: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h04: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h05: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h06: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h07: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h08: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h09: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h0a: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h0b: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h0c: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h0d: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h0e: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h0f: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h10: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h11: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h12: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h13: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h14: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h15: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h16: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h17: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h18: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h19: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h1a: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h1b: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h1c: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h1d: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h1e: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h1f: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h20: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h21: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h22: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h23: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h24: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h25: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h26: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h27: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h28: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h29: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h2a: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h2b: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h2c: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h2d: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h2e: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h2f: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h30: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h31: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h32: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h33: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h34: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h35: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h36: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h37: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h38: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h39: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h3a: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h3b: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h3c: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h3d: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h3e: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h3f: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h40: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h41: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h42: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h43: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h44: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h45: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h46: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h47: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h48: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h49: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h4a: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h4b: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h4c: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h4d: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h4e: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h4f: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h50: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'h51: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h52: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h53: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h54: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h55: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h56: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h57: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'h58: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h59: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h5a: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h5b: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h5c: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h5d: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h5e: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h5f: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h60: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h61: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h62: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h63: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h64: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'h65: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h66: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h67: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h68: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h69: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h6a: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h6b: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h6c: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h6d: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h6e: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h6f: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h70: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h71: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'h72: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h73: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h74: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h75: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h76: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h77: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h78: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h79: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h7a: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'h7b: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h7c: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h7d: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h7e: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h7f: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h80: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h81: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h82: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h83: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h84: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h85: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'h86: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h87: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'h88: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'h89: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'h8a: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h8b: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'h8c: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h8d: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h8e: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'h8f: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'h90: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h91: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h92: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h93: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h94: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h95: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'h96: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'h97: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h98: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'h99: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'h9a: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'h9b: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h9c: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'h9d: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'h9e: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'h9f: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'ha0: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'ha1: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'ha2: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'ha3: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'ha4: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'ha5: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'ha6: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'ha7: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'ha8: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'ha9: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'haa: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hab: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'hac: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'had: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'hae: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'haf: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hb0: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hb1: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'hb2: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hb3: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hb4: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hb5: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'hb6: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hb7: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'hb8: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hb9: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'hba: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'hbb: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hbc: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'hbd: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'hbe: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'hbf: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hc0: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'hc1: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hc2: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hc3: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'hc4: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'hc5: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hc6: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hc7: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'hc8: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'hc9: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hca: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'hcb: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'hcc: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hcd: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'hce: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hcf: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hd0: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'hd1: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hd2: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'hd3: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'hd4: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'hd5: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'hd6: begin outr <= outr^index[8:5]^4'hb; end
|
||||||
|
8'hd7: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'hd8: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'hd9: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hda: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'hdb: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'hdc: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hdd: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'hde: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hdf: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'he0: begin outr <= outr^index[8:5]^4'h7; end
|
||||||
|
8'he1: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'he2: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'he3: begin outr <= outr^index[8:5]^4'h3; end
|
||||||
|
8'he4: begin outr <= outr^index[8:5]^4'h2; end
|
||||||
|
8'he5: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'he6: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'he7: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'he8: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'he9: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'hea: begin outr <= outr^index[8:5]^4'hc; end
|
||||||
|
8'heb: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'hec: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'hed: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hee: begin outr <= outr^index[8:5]^4'h9; end
|
||||||
|
8'hef: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'hf0: begin outr <= outr^index[8:5]^4'hd; end
|
||||||
|
8'hf1: begin outr <= outr^index[8:5]^4'hf; end
|
||||||
|
8'hf2: begin outr <= outr^index[8:5]^4'h4; end
|
||||||
|
8'hf3: begin outr <= outr^index[8:5]^4'ha; end
|
||||||
|
8'hf4: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'hf5: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hf6: begin outr <= outr^index[8:5]^4'he; end
|
||||||
|
8'hf7: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'hf8: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'hf9: begin outr <= outr^index[8:5]^4'h0; end
|
||||||
|
8'hfa: begin outr <= outr^index[8:5]^4'h5; end
|
||||||
|
8'hfb: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
8'hfc: begin outr <= outr^index[8:5]^4'h8; end
|
||||||
|
8'hfd: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
8'hfe: begin outr <= outr^index[8:5]^4'h1; end
|
||||||
|
default: begin outr <= outr^index[8:5]^4'h6; end
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
endmodule
|
87
test/cli/verilog/t_gen_alw.v
Normal file
87
test/cli/verilog/t_gen_alw.v
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
integer cyc=0;
|
||||||
|
reg [63:0] crc;
|
||||||
|
reg [63:0] sum;
|
||||||
|
|
||||||
|
// Take CRC data and apply to testblock inputs
|
||||||
|
wire [9:0] in = crc[9:0];
|
||||||
|
|
||||||
|
/*AUTOWIRE*/
|
||||||
|
|
||||||
|
Test test (/*AUTOINST*/
|
||||||
|
// Inputs
|
||||||
|
.clk (clk),
|
||||||
|
.in (in[9:0]));
|
||||||
|
|
||||||
|
// Aggregate outputs into a single result vector
|
||||||
|
wire [63:0] result = {64'h0};
|
||||||
|
|
||||||
|
// Test loop
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
`ifdef TEST_VERBOSE
|
||||||
|
$write("[%0t] cyc==%0d crc=%x result=%x\n",$time, cyc, crc, result);
|
||||||
|
`endif
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
crc <= {crc[62:0], crc[63]^crc[2]^crc[0]};
|
||||||
|
sum <= result ^ {sum[62:0],sum[63]^sum[2]^sum[0]};
|
||||||
|
if (cyc==0) begin
|
||||||
|
// Setup
|
||||||
|
crc <= 64'h5aef0c8d_d70a4497;
|
||||||
|
end
|
||||||
|
else if (cyc<10) begin
|
||||||
|
sum <= 64'h0;
|
||||||
|
end
|
||||||
|
else if (cyc<90) begin
|
||||||
|
end
|
||||||
|
else if (cyc==99) begin
|
||||||
|
$write("[%0t] cyc==%0d crc=%x sum=%x\n",$time, cyc, crc, sum);
|
||||||
|
if (crc !== 64'hc77bb9b3784ea091) $stop;
|
||||||
|
// What checksum will we end up with (above print should match)
|
||||||
|
`define EXPECTED_SUM 64'h0
|
||||||
|
if (sum !== `EXPECTED_SUM) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module test_top (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk, in
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
input [9:0] in;
|
||||||
|
|
||||||
|
reg a [9:0];
|
||||||
|
integer ai;
|
||||||
|
always @* begin
|
||||||
|
for (ai=0;ai<10;ai=ai+1) begin
|
||||||
|
a[ai]=in[ai];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
reg [1:0] b [9:0];
|
||||||
|
integer j;
|
||||||
|
|
||||||
|
generate
|
||||||
|
genvar i;
|
||||||
|
for (i=0; i<2; i=i+1) begin
|
||||||
|
always @(posedge clk) begin
|
||||||
|
for (j=0; j<10; j=j+1) begin
|
||||||
|
if (a[j])
|
||||||
|
b[i][j] <= 1'b0;
|
||||||
|
else
|
||||||
|
b[i][j] <= 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
endmodule
|
107
test/cli/verilog/t_order.v
Normal file
107
test/cli/verilog/t_order.v
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
|
||||||
|
// surefire lint_off ASWEBB
|
||||||
|
// surefire lint_off ASWEMB
|
||||||
|
// surefire lint_off STMINI
|
||||||
|
// surefire lint_off CSEBEQ
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
reg [7:0] a_to_clk_levm3;
|
||||||
|
reg [7:0] b_to_clk_levm1;
|
||||||
|
reg [7:0] c_com_levs10;
|
||||||
|
reg [7:0] d_to_clk_levm2;
|
||||||
|
/*AUTOWIRE*/
|
||||||
|
// Beginning of automatic wires (for undeclared instantiated-module outputs)
|
||||||
|
wire [7:0] m_from_clk_lev1_r; // From a of t_order_a.v
|
||||||
|
wire [7:0] n_from_clk_lev2; // From a of t_order_a.v
|
||||||
|
wire [7:0] o_from_com_levs11; // From a of t_order_a.v
|
||||||
|
wire [7:0] o_from_comandclk_levs12;// From a of t_order_a.v
|
||||||
|
wire [7:0] o_subfrom_clk_lev2; // From b of t_order_b.v
|
||||||
|
// End of automatics
|
||||||
|
|
||||||
|
reg [7:0] cyc; initial cyc=0;
|
||||||
|
|
||||||
|
t_order_a a (
|
||||||
|
.one (8'h1),
|
||||||
|
/*AUTOINST*/
|
||||||
|
// Outputs
|
||||||
|
.m_from_clk_lev1_r (m_from_clk_lev1_r[7:0]),
|
||||||
|
.n_from_clk_lev2 (n_from_clk_lev2[7:0]),
|
||||||
|
.o_from_com_levs11 (o_from_com_levs11[7:0]),
|
||||||
|
.o_from_comandclk_levs12(o_from_comandclk_levs12[7:0]),
|
||||||
|
// Inputs
|
||||||
|
.clk (clk),
|
||||||
|
.a_to_clk_levm3 (a_to_clk_levm3[7:0]),
|
||||||
|
.b_to_clk_levm1 (b_to_clk_levm1[7:0]),
|
||||||
|
.c_com_levs10 (c_com_levs10[7:0]),
|
||||||
|
.d_to_clk_levm2 (d_to_clk_levm2[7:0]));
|
||||||
|
|
||||||
|
t_order_b b (
|
||||||
|
/*AUTOINST*/
|
||||||
|
// Outputs
|
||||||
|
.o_subfrom_clk_lev2 (o_subfrom_clk_lev2[7:0]),
|
||||||
|
// Inputs
|
||||||
|
.m_from_clk_lev1_r (m_from_clk_lev1_r[7:0]));
|
||||||
|
|
||||||
|
reg [7:0] o_from_com_levs12;
|
||||||
|
reg [7:0] o_from_com_levs13;
|
||||||
|
always @ (/*AS*/o_from_com_levs11) begin
|
||||||
|
o_from_com_levs12 = o_from_com_levs11 + 8'h1;
|
||||||
|
o_from_com_levs12 = o_from_com_levs12 + 8'h1; // Test we can add to self and optimize
|
||||||
|
o_from_com_levs13 = o_from_com_levs12;
|
||||||
|
end
|
||||||
|
|
||||||
|
reg sepassign_in;
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
wire [3:0] sepassign;
|
||||||
|
// verilator lint_on UNOPTFLAT
|
||||||
|
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
assign #0.1 sepassign[0] = 0,
|
||||||
|
sepassign[1] = sepassign[2],
|
||||||
|
sepassign[2] = sepassign[3],
|
||||||
|
sepassign[3] = sepassign_in;
|
||||||
|
wire [7:0] o_subfrom_clk_lev3 = o_subfrom_clk_lev2;
|
||||||
|
// verilator lint_on UNOPT
|
||||||
|
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
cyc <= cyc+8'd1;
|
||||||
|
sepassign_in <= 0;
|
||||||
|
if (cyc == 8'd1) begin
|
||||||
|
a_to_clk_levm3 <= 0;
|
||||||
|
d_to_clk_levm2 <= 1;
|
||||||
|
b_to_clk_levm1 <= 1;
|
||||||
|
c_com_levs10 <= 2;
|
||||||
|
sepassign_in <= 1;
|
||||||
|
end
|
||||||
|
if (cyc == 8'd2) begin
|
||||||
|
if (sepassign !== 4'b1110) $stop;
|
||||||
|
end
|
||||||
|
if (cyc == 8'd3) begin
|
||||||
|
|
||||||
|
$display("%d %d %d %d",m_from_clk_lev1_r,
|
||||||
|
n_from_clk_lev2,
|
||||||
|
o_from_com_levs11,
|
||||||
|
o_from_comandclk_levs12);
|
||||||
|
|
||||||
|
if (m_from_clk_lev1_r !== 8'h2) $stop;
|
||||||
|
if (o_subfrom_clk_lev3 !== 8'h2) $stop;
|
||||||
|
if (n_from_clk_lev2 !== 8'h2) $stop;
|
||||||
|
if (o_from_com_levs11 !== 8'h3) $stop;
|
||||||
|
if (o_from_com_levs13 !== 8'h5) $stop;
|
||||||
|
if (o_from_comandclk_levs12 !== 8'h5) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
79
test/cli/verilog/t_order_2d.v
Normal file
79
test/cli/verilog/t_order_2d.v
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2015 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
integer cyc=0;
|
||||||
|
reg [63:0] crc;
|
||||||
|
reg [63:0] sum;
|
||||||
|
|
||||||
|
// Take CRC data and apply to testblock inputs
|
||||||
|
wire input_signal = crc[0];
|
||||||
|
|
||||||
|
/*AUTOWIRE*/
|
||||||
|
// Beginning of automatic wires (for undeclared instantiated-module outputs)
|
||||||
|
wire output_signal; // From test of Test.v
|
||||||
|
// End of automatics
|
||||||
|
|
||||||
|
Test test (/*AUTOINST*/
|
||||||
|
// Outputs
|
||||||
|
.output_signal (output_signal),
|
||||||
|
// Inputs
|
||||||
|
.input_signal (input_signal));
|
||||||
|
|
||||||
|
// Aggregate outputs into a single result vector
|
||||||
|
wire [63:0] result = {63'h0, output_signal};
|
||||||
|
|
||||||
|
// Test loop
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
`ifdef TEST_VERBOSE
|
||||||
|
$write("[%0t] cyc==%0d crc=%x result=%x\n",$time, cyc, crc, result);
|
||||||
|
`endif
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
crc <= {crc[62:0], crc[63]^crc[2]^crc[0]};
|
||||||
|
sum <= result ^ {sum[62:0],sum[63]^sum[2]^sum[0]};
|
||||||
|
if (cyc==0) begin
|
||||||
|
// Setup
|
||||||
|
crc <= 64'h5aef0c8d_d70a4497;
|
||||||
|
sum <= '0;
|
||||||
|
end
|
||||||
|
else if (cyc<10) begin
|
||||||
|
sum <= '0;
|
||||||
|
end
|
||||||
|
else if (cyc<90) begin
|
||||||
|
end
|
||||||
|
else if (cyc==99) begin
|
||||||
|
$write("[%0t] cyc==%0d crc=%x sum=%x\n",$time, cyc, crc, sum);
|
||||||
|
if (crc !== 64'hc77bb9b3784ea091) $stop;
|
||||||
|
// What checksum will we end up with (above print should match)
|
||||||
|
`define EXPECTED_SUM 64'h765b2e12b25ec97b
|
||||||
|
if (sum !== `EXPECTED_SUM) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module Test (
|
||||||
|
input input_signal,
|
||||||
|
output output_signal
|
||||||
|
);
|
||||||
|
|
||||||
|
// bug872
|
||||||
|
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
wire some_signal[1:0][1:0];
|
||||||
|
assign some_signal[0][0] = input_signal;
|
||||||
|
assign some_signal[0][1] = some_signal[0][0];
|
||||||
|
assign some_signal[1][0] = some_signal[0][1];
|
||||||
|
assign some_signal[1][1] = some_signal[1][0];
|
||||||
|
assign output_signal = some_signal[1][1];
|
||||||
|
|
||||||
|
endmodule
|
52
test/cli/verilog/t_order_a.v
Normal file
52
test/cli/verilog/t_order_a.v
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t_order_a (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
m_from_clk_lev1_r, n_from_clk_lev2, o_from_com_levs11, o_from_comandclk_levs12,
|
||||||
|
// Inputs
|
||||||
|
clk, a_to_clk_levm3, b_to_clk_levm1, c_com_levs10, d_to_clk_levm2, one
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
input [7:0] a_to_clk_levm3;
|
||||||
|
input [7:0] b_to_clk_levm1;
|
||||||
|
input [7:0] c_com_levs10;
|
||||||
|
input [7:0] d_to_clk_levm2;
|
||||||
|
input [7:0] one;
|
||||||
|
output [7:0] m_from_clk_lev1_r;
|
||||||
|
output [7:0] n_from_clk_lev2;
|
||||||
|
output [7:0] o_from_com_levs11;
|
||||||
|
output [7:0] o_from_comandclk_levs12;
|
||||||
|
|
||||||
|
/*AUTOREG*/
|
||||||
|
// Beginning of automatic regs (for this module's undeclared outputs)
|
||||||
|
reg [7:0] m_from_clk_lev1_r;
|
||||||
|
// End of automatics
|
||||||
|
|
||||||
|
// surefire lint_off ASWEBB
|
||||||
|
// surefire lint_off ASWEMB
|
||||||
|
|
||||||
|
wire [7:0] a_to_clk_levm1;
|
||||||
|
wire [7:0] a_to_clk_levm2;
|
||||||
|
wire [7:0] c_com_levs11;
|
||||||
|
reg [7:0] o_from_comandclk_levs12;
|
||||||
|
wire [7:0] n_from_clk_lev2;
|
||||||
|
wire [7:0] n_from_clk_lev3;
|
||||||
|
|
||||||
|
assign a_to_clk_levm1 = a_to_clk_levm2 + d_to_clk_levm2;
|
||||||
|
assign a_to_clk_levm2 = a_to_clk_levm3 + 0;
|
||||||
|
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
m_from_clk_lev1_r <= a_to_clk_levm1 + b_to_clk_levm1;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign c_com_levs11 = c_com_levs10 + one;
|
||||||
|
always @ (/*AS*/c_com_levs11 or n_from_clk_lev3) o_from_comandclk_levs12 = c_com_levs11 + n_from_clk_lev3;
|
||||||
|
assign n_from_clk_lev2 = m_from_clk_lev1_r;
|
||||||
|
assign n_from_clk_lev3 = n_from_clk_lev2;
|
||||||
|
wire [7:0] o_from_com_levs11 = c_com_levs10 + 1;
|
||||||
|
|
||||||
|
endmodule
|
18
test/cli/verilog/t_order_b.v
Normal file
18
test/cli/verilog/t_order_b.v
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t_order_b (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
o_subfrom_clk_lev2,
|
||||||
|
// Inputs
|
||||||
|
m_from_clk_lev1_r
|
||||||
|
);
|
||||||
|
|
||||||
|
input [7:0] m_from_clk_lev1_r;
|
||||||
|
output [7:0] o_subfrom_clk_lev2;
|
||||||
|
|
||||||
|
wire [7:0] o_subfrom_clk_lev2 = m_from_clk_lev1_r;
|
||||||
|
|
||||||
|
endmodule
|
116
test/cli/verilog/t_order_clkinst.v
Normal file
116
test/cli/verilog/t_order_clkinst.v
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
// verilator lint_off COMBDLY
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
|
||||||
|
reg c1_start; initial c1_start = 0;
|
||||||
|
wire [31:0] c1_count;
|
||||||
|
comb_loop c1 (.count(c1_count), .start(c1_start));
|
||||||
|
|
||||||
|
wire s2_start = (c1_count==0 && c1_start);
|
||||||
|
wire [31:0] s2_count;
|
||||||
|
seq_loop s2 (.count(s2_count), .start(s2_start));
|
||||||
|
|
||||||
|
wire c3_start = (s2_count[0]);
|
||||||
|
wire [31:0] c3_count;
|
||||||
|
comb_loop c3 (.count(c3_count), .start(c3_start));
|
||||||
|
|
||||||
|
reg [7:0] cyc; initial cyc=0;
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
//$write("[%0t] %x counts %x %x %x\n",$time,cyc,c1_count,s2_count,c3_count);
|
||||||
|
cyc <= cyc + 8'd1;
|
||||||
|
case (cyc)
|
||||||
|
8'd00: begin
|
||||||
|
c1_start <= 1'b0;
|
||||||
|
end
|
||||||
|
8'd01: begin
|
||||||
|
c1_start <= 1'b1;
|
||||||
|
end
|
||||||
|
default: ;
|
||||||
|
endcase
|
||||||
|
case (cyc)
|
||||||
|
8'd02: begin
|
||||||
|
if (c1_count!=32'h3) $stop;
|
||||||
|
if (s2_count!=32'h3) $stop;
|
||||||
|
if (c3_count!=32'h6) $stop;
|
||||||
|
end
|
||||||
|
8'd03: begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
default: ;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module comb_loop (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
count,
|
||||||
|
// Inputs
|
||||||
|
start
|
||||||
|
);
|
||||||
|
input start;
|
||||||
|
output reg [31:0] count; initial count = 0;
|
||||||
|
|
||||||
|
reg [31:0] runnerm1, runner; initial runner = 0;
|
||||||
|
|
||||||
|
always @ (start) begin
|
||||||
|
if (start) begin
|
||||||
|
runner = 3;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/runner) begin
|
||||||
|
runnerm1 = runner - 32'd1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/runnerm1) begin
|
||||||
|
if (runner > 0) begin
|
||||||
|
count = count + 1;
|
||||||
|
runner = runnerm1;
|
||||||
|
$write ("%m count=%d runner =%x\n",count, runnerm1);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module seq_loop (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
count,
|
||||||
|
// Inputs
|
||||||
|
start
|
||||||
|
);
|
||||||
|
input start;
|
||||||
|
output reg [31:0] count; initial count = 0;
|
||||||
|
|
||||||
|
reg [31:0] runnerm1, runner; initial runner = 0;
|
||||||
|
|
||||||
|
always @ (start) begin
|
||||||
|
if (start) begin
|
||||||
|
runner <= 3;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/runner) begin
|
||||||
|
runnerm1 = runner - 32'd1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/runnerm1) begin
|
||||||
|
if (runner > 0) begin
|
||||||
|
count = count + 1;
|
||||||
|
runner <= runnerm1;
|
||||||
|
$write ("%m count=%d runner<=%x\n",count, runnerm1);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
68
test/cli/verilog/t_order_comboclkloop.v
Normal file
68
test/cli/verilog/t_order_comboclkloop.v
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
// verilator lint_off BLKANDNBLK
|
||||||
|
// verilator lint_off COMBDLY
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
// verilator lint_off MULTIDRIVEN
|
||||||
|
|
||||||
|
reg [31:0] runnerm1, runner; initial runner = 0;
|
||||||
|
reg [31:0] runcount; initial runcount = 0;
|
||||||
|
reg [31:0] clkrun; initial clkrun = 0;
|
||||||
|
reg [31:0] clkcount; initial clkcount = 0;
|
||||||
|
always @ (/*AS*/runner) begin
|
||||||
|
runnerm1 = runner - 32'd1;
|
||||||
|
end
|
||||||
|
reg run0;
|
||||||
|
always @ (/*AS*/runnerm1) begin
|
||||||
|
if ((runner & 32'hf)!=0) begin
|
||||||
|
runcount = runcount + 1;
|
||||||
|
runner = runnerm1;
|
||||||
|
$write (" seq runcount=%0d runner =%0x\n",runcount, runnerm1);
|
||||||
|
end
|
||||||
|
run0 = (runner[8:4]!=0 && runner[3:0]==0);
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (posedge run0) begin
|
||||||
|
// Do something that forces another combo run
|
||||||
|
clkcount <= clkcount + 1;
|
||||||
|
runner[8:4] <= runner[8:4] - 1;
|
||||||
|
runner[3:0] <= 3;
|
||||||
|
$write ("[%0t] posedge runner=%0x\n", $time, runner);
|
||||||
|
end
|
||||||
|
|
||||||
|
reg [7:0] cyc; initial cyc=0;
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
$write("[%0t] %x counts %0x %0x\n",$time,cyc,runcount,clkcount);
|
||||||
|
cyc <= cyc + 8'd1;
|
||||||
|
case (cyc)
|
||||||
|
8'd00: begin
|
||||||
|
runner <= 0;
|
||||||
|
end
|
||||||
|
8'd01: begin
|
||||||
|
runner <= 32'h35;
|
||||||
|
end
|
||||||
|
default: ;
|
||||||
|
endcase
|
||||||
|
case (cyc)
|
||||||
|
8'd02: begin
|
||||||
|
if (runcount!=32'he) $stop;
|
||||||
|
if (clkcount!=32'h3) $stop;
|
||||||
|
end
|
||||||
|
8'd03: begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
default: ;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
endmodule
|
55
test/cli/verilog/t_order_comboloop.v
Normal file
55
test/cli/verilog/t_order_comboloop.v
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
integer cyc; initial cyc=1;
|
||||||
|
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
reg [31:0] runner; initial runner = 5;
|
||||||
|
reg [31:0] runnerm1;
|
||||||
|
reg [59:0] runnerq;
|
||||||
|
reg [89:0] runnerw;
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
if (cyc!=0) begin
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
if (cyc==1) begin
|
||||||
|
`ifdef verilator
|
||||||
|
if (runner != 0) $stop; // Initial settlement failed
|
||||||
|
`endif
|
||||||
|
end
|
||||||
|
if (cyc==2) begin
|
||||||
|
runner = 20;
|
||||||
|
runnerq = 60'h0;
|
||||||
|
runnerw = 90'h0;
|
||||||
|
end
|
||||||
|
if (cyc==3) begin
|
||||||
|
if (runner != 0) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// This forms a "loop" where we keep going through the always till runner=0
|
||||||
|
// This isn't "regular" beh code, but insures our change detection is working properly
|
||||||
|
always @ (/*AS*/runner) begin
|
||||||
|
runnerm1 = runner - 32'd1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/runnerm1) begin
|
||||||
|
if (runner > 0) begin
|
||||||
|
runner = runnerm1;
|
||||||
|
runnerq = runnerq - 60'd1;
|
||||||
|
runnerw = runnerw - 90'd1;
|
||||||
|
$write ("[%0t] runner=%d\n", $time, runner);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
99
test/cli/verilog/t_order_doubleloop.v
Normal file
99
test/cli/verilog/t_order_doubleloop.v
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2005 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
integer cyc; initial cyc=1;
|
||||||
|
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
// verilator lint_off MULTIDRIVEN
|
||||||
|
// verilator lint_off BLKANDNBLK
|
||||||
|
|
||||||
|
reg [31:0] comcnt;
|
||||||
|
reg [31:0] dlycnt; initial dlycnt=0;
|
||||||
|
reg [31:0] lastdlycnt; initial lastdlycnt = 0;
|
||||||
|
|
||||||
|
reg [31:0] comrun; initial comrun = 0;
|
||||||
|
reg [31:0] comrunm1;
|
||||||
|
reg [31:0] dlyrun; initial dlyrun = 0;
|
||||||
|
reg [31:0] dlyrunm1;
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
$write("[%0t] cyc %d\n",$time,cyc);
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
if (cyc==2) begin
|
||||||
|
// Test # of iters
|
||||||
|
lastdlycnt = 0;
|
||||||
|
comcnt = 0;
|
||||||
|
dlycnt <= 0;
|
||||||
|
end
|
||||||
|
if (cyc==3) begin
|
||||||
|
dlyrun <= 5;
|
||||||
|
dlycnt <= 0;
|
||||||
|
end
|
||||||
|
if (cyc==4) begin
|
||||||
|
comrun = 4;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
always @ (negedge clk) begin
|
||||||
|
if (cyc==5) begin
|
||||||
|
$display("%d %d\n", dlycnt, comcnt);
|
||||||
|
if (dlycnt != 32'd5) $stop;
|
||||||
|
if (comcnt != 32'd19) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// This forms a "loop" where we keep going through the always till comrun=0
|
||||||
|
reg runclk; initial runclk = 1'b0;
|
||||||
|
always @ (/*AS*/comrunm1 or dlycnt) begin
|
||||||
|
if (lastdlycnt != dlycnt) begin
|
||||||
|
comrun = 3;
|
||||||
|
$write ("[%0t] comrun=%0d start\n", $time, comrun);
|
||||||
|
end
|
||||||
|
else if (comrun > 0) begin
|
||||||
|
comrun = comrunm1;
|
||||||
|
if (comrunm1==1) begin
|
||||||
|
runclk = 1;
|
||||||
|
$write ("[%0t] comrun=%0d [trigger clk]\n", $time, comrun);
|
||||||
|
end
|
||||||
|
else $write ("[%0t] comrun=%0d\n", $time, comrun);
|
||||||
|
end
|
||||||
|
lastdlycnt = dlycnt;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (/*AS*/comrun) begin
|
||||||
|
if (comrun!=0) begin
|
||||||
|
comrunm1 = comrun - 32'd1;
|
||||||
|
comcnt = comcnt + 32'd1;
|
||||||
|
$write("[%0t] comcnt=%0d\n",$time,comcnt);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// This forms a "loop" where we keep going through the always till dlyrun=0
|
||||||
|
reg runclkrst;
|
||||||
|
always @ (posedge runclk) begin
|
||||||
|
runclkrst <= 1;
|
||||||
|
$write ("[%0t] runclk\n", $time);
|
||||||
|
if (dlyrun > 0) begin
|
||||||
|
dlyrun <= dlyrun - 32'd1;
|
||||||
|
dlycnt <= dlycnt + 32'd1;
|
||||||
|
$write ("[%0t] dlyrun<=%0d\n", $time, dlyrun-32'd1);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @* begin
|
||||||
|
if (runclkrst) begin
|
||||||
|
$write ("[%0t] runclk reset\n", $time);
|
||||||
|
runclkrst = 0;
|
||||||
|
runclk = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
62
test/cli/verilog/t_order_first.v
Normal file
62
test/cli/verilog/t_order_first.v
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2003 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
fastclk
|
||||||
|
);
|
||||||
|
input fastclk;
|
||||||
|
|
||||||
|
t_netlist tnetlist
|
||||||
|
(.also_fastclk (fastclk),
|
||||||
|
/*AUTOINST*/
|
||||||
|
// Inputs
|
||||||
|
.fastclk (fastclk));
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module t_netlist (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
fastclk, also_fastclk
|
||||||
|
);
|
||||||
|
|
||||||
|
// surefire lint_off ASWEMB
|
||||||
|
|
||||||
|
input fastclk;
|
||||||
|
input also_fastclk;
|
||||||
|
integer _mode; initial _mode = 0;
|
||||||
|
|
||||||
|
// This entire module should optimize to nearly nothing...
|
||||||
|
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
reg [4:0] a,a2,b,c,d,e;
|
||||||
|
// verilator lint_on UNOPTFLAT
|
||||||
|
|
||||||
|
initial a=5'd1;
|
||||||
|
|
||||||
|
always @ (posedge fastclk) begin
|
||||||
|
b <= a+5'd1;
|
||||||
|
c <= b+5'd1; // Better for ordering if this moves before previous statement
|
||||||
|
end
|
||||||
|
|
||||||
|
// verilator lint_off UNOPT
|
||||||
|
always @ (d or /*AS*/a or c) begin
|
||||||
|
e = d+5'd1;
|
||||||
|
a2 = a+5'd1; // This can be pulled out of the middle of the always
|
||||||
|
d = c+5'd1; // Better for ordering if this moves before previous statement
|
||||||
|
end
|
||||||
|
// verilator lint_on UNOPT
|
||||||
|
|
||||||
|
always @ (posedge also_fastclk) begin
|
||||||
|
if (_mode==5) begin
|
||||||
|
if (a2 != 5'd2) $stop;
|
||||||
|
if (e != 5'd5) $stop;
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
_mode <= _mode + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
41
test/cli/verilog/t_order_loop_bad.v
Normal file
41
test/cli/verilog/t_order_loop_bad.v
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// DESCRIPTION: Verilator: Non-cutable edge in loop
|
||||||
|
//
|
||||||
|
// This code (stripped down from a much larger application) has a loop between
|
||||||
|
// the use of ready in the first two always blocks. However it should
|
||||||
|
// trivially trigger the $write on the first clk posedge.
|
||||||
|
//
|
||||||
|
// This is a regression test against issue 513.
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2012 by Jeremy Bennett.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
reg ready;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
ready = 1'b0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge ready) begin
|
||||||
|
if ((ready === 1'b1)) begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge ready) begin
|
||||||
|
if ((ready === 1'b0)) begin
|
||||||
|
ready = 1'b1 ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
ready = 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
61
test/cli/verilog/t_order_multialways.v
Normal file
61
test/cli/verilog/t_order_multialways.v
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2005 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Inputs
|
||||||
|
clk
|
||||||
|
);
|
||||||
|
|
||||||
|
input clk;
|
||||||
|
|
||||||
|
reg [31:0] in_a;
|
||||||
|
reg [31:0] in_b;
|
||||||
|
|
||||||
|
reg [31:0] e,f,g,h;
|
||||||
|
|
||||||
|
always @ (/*AS*/in_a) begin
|
||||||
|
e = in_a;
|
||||||
|
f = {e[15:0], e[31:16]};
|
||||||
|
g = {f[15:0], f[31:16]};
|
||||||
|
h = {g[15:0], g[31:16]};
|
||||||
|
end
|
||||||
|
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
reg [31:0] e2,f2,g2,h2;
|
||||||
|
always @ (/*AS*/f2) begin
|
||||||
|
h2 = {g2[15:0], g2[31:16]};
|
||||||
|
g2 = {f2[15:0], f2[31:16]};
|
||||||
|
end
|
||||||
|
always @ (/*AS*/in_a) begin
|
||||||
|
f2 = {e2[15:0], e2[31:16]};
|
||||||
|
e2 = in_a;
|
||||||
|
end
|
||||||
|
// verilator lint_on UNOPTFLAT
|
||||||
|
|
||||||
|
integer cyc; initial cyc=1;
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
if (cyc!=0) begin
|
||||||
|
cyc <= cyc + 1;
|
||||||
|
//$write("%d %x %x\n", cyc, h, h2);
|
||||||
|
if (h != h2) $stop;
|
||||||
|
if (cyc==1) begin
|
||||||
|
in_a <= 32'h89a14fab;
|
||||||
|
in_b <= 32'h7ab512fa;
|
||||||
|
end
|
||||||
|
if (cyc==2) begin
|
||||||
|
in_a <= 32'hf4c11a42;
|
||||||
|
in_b <= 32'h359967c6;
|
||||||
|
if (h != 32'h4fab89a1) $stop;
|
||||||
|
end
|
||||||
|
if (cyc==3) begin
|
||||||
|
if (h != 32'h1a42f4c1) $stop;
|
||||||
|
end
|
||||||
|
if (cyc==9) begin
|
||||||
|
$write("*-* All Finished *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule
|
192
test/cli/verilog/t_order_multidriven.v
Normal file
192
test/cli/verilog/t_order_multidriven.v
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2013 by Ted Campbell.
|
||||||
|
|
||||||
|
//With MULTI_CLK defined shows bug, without it is hidden
|
||||||
|
`define MULTI_CLK
|
||||||
|
|
||||||
|
//bug634
|
||||||
|
|
||||||
|
module t (
|
||||||
|
input i_clk_wr,
|
||||||
|
input i_clk_rd
|
||||||
|
);
|
||||||
|
|
||||||
|
wire wr$wen;
|
||||||
|
wire [7:0] wr$addr;
|
||||||
|
wire [7:0] wr$wdata;
|
||||||
|
wire [7:0] wr$rdata;
|
||||||
|
|
||||||
|
wire rd$wen;
|
||||||
|
wire [7:0] rd$addr;
|
||||||
|
wire [7:0] rd$wdata;
|
||||||
|
wire [7:0] rd$rdata;
|
||||||
|
|
||||||
|
wire clk_wr;
|
||||||
|
wire clk_rd;
|
||||||
|
|
||||||
|
`ifdef MULTI_CLK
|
||||||
|
assign clk_wr = i_clk_wr;
|
||||||
|
assign clk_rd = i_clk_rd;
|
||||||
|
`else
|
||||||
|
assign clk_wr = i_clk_wr;
|
||||||
|
assign clk_rd = i_clk_wr;
|
||||||
|
`endif
|
||||||
|
|
||||||
|
FooWr u_wr (
|
||||||
|
.i_clk ( clk_wr ),
|
||||||
|
|
||||||
|
.o_wen ( wr$wen ),
|
||||||
|
.o_addr ( wr$addr ),
|
||||||
|
.o_wdata ( wr$wdata ),
|
||||||
|
.i_rdata ( wr$rdata )
|
||||||
|
);
|
||||||
|
|
||||||
|
FooRd u_rd (
|
||||||
|
.i_clk ( clk_rd ),
|
||||||
|
|
||||||
|
.o_wen ( rd$wen ),
|
||||||
|
.o_addr ( rd$addr ),
|
||||||
|
.o_wdata ( rd$wdata ),
|
||||||
|
.i_rdata ( rd$rdata )
|
||||||
|
);
|
||||||
|
|
||||||
|
FooMem u_mem (
|
||||||
|
.iv_clk ( {clk_wr, clk_rd } ),
|
||||||
|
.iv_wen ( {wr$wen, rd$wen } ),
|
||||||
|
.iv_addr ( {wr$addr, rd$addr } ),
|
||||||
|
.iv_wdata ( {wr$wdata,rd$wdata} ),
|
||||||
|
.ov_rdata ( {wr$rdata,rd$rdata} )
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// Memory Writer
|
||||||
|
module FooWr(
|
||||||
|
input i_clk,
|
||||||
|
|
||||||
|
output o_wen,
|
||||||
|
output [7:0] o_addr,
|
||||||
|
output [7:0] o_wdata,
|
||||||
|
input [7:0] i_rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [7:0] cnt = 0;
|
||||||
|
|
||||||
|
// Count [0,200]
|
||||||
|
always @( posedge i_clk )
|
||||||
|
if ( cnt < 8'd50 )
|
||||||
|
cnt <= cnt + 8'd1;
|
||||||
|
|
||||||
|
// Write addr in (10,30) if even
|
||||||
|
assign o_wen = ( cnt > 8'd10 ) && ( cnt < 8'd30 ) && ( cnt[0] == 1'b0 );
|
||||||
|
assign o_addr = cnt;
|
||||||
|
assign o_wdata = cnt;
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// Memory Reader
|
||||||
|
module FooRd(
|
||||||
|
input i_clk,
|
||||||
|
|
||||||
|
output o_wen,
|
||||||
|
output [7:0] o_addr,
|
||||||
|
output [7:0] o_wdata,
|
||||||
|
input [7:0] i_rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [7:0] cnt = 0;
|
||||||
|
reg [7:0] addr_r;
|
||||||
|
reg en_r;
|
||||||
|
|
||||||
|
// Count [0,200]
|
||||||
|
always @( posedge i_clk )
|
||||||
|
if ( cnt < 8'd200 )
|
||||||
|
cnt <= cnt + 8'd1;
|
||||||
|
|
||||||
|
// Read data
|
||||||
|
assign o_wen = 0;
|
||||||
|
assign o_addr = cnt - 8'd100;
|
||||||
|
|
||||||
|
// Track issued read
|
||||||
|
always @( posedge i_clk )
|
||||||
|
begin
|
||||||
|
addr_r <= o_addr;
|
||||||
|
en_r <= ( cnt > 8'd110 ) && ( cnt < 8'd130 ) && ( cnt[0] == 1'b0 );
|
||||||
|
end
|
||||||
|
|
||||||
|
// Display to console 100 cycles after writer
|
||||||
|
always @( negedge i_clk )
|
||||||
|
if ( en_r ) begin
|
||||||
|
`ifdef TEST_VERBOSE
|
||||||
|
$display( "MEM[%x] == %x", addr_r, i_rdata );
|
||||||
|
`endif
|
||||||
|
if (addr_r != i_rdata) $stop;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// Multi-port memory abstraction
|
||||||
|
module FooMem(
|
||||||
|
input [2 -1:0] iv_clk,
|
||||||
|
input [2 -1:0] iv_wen,
|
||||||
|
input [2*8-1:0] iv_addr,
|
||||||
|
input [2*8-1:0] iv_wdata,
|
||||||
|
output [2*8-1:0] ov_rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
FooMemImpl u_impl (
|
||||||
|
.a_clk ( iv_clk [0*1+:1] ),
|
||||||
|
.a_wen ( iv_wen [0*1+:1] ),
|
||||||
|
.a_addr ( iv_addr [0*8+:8] ),
|
||||||
|
.a_wdata ( iv_wdata[0*8+:8] ),
|
||||||
|
.a_rdata ( ov_rdata[0*8+:8] ),
|
||||||
|
|
||||||
|
.b_clk ( iv_clk [1*1+:1] ),
|
||||||
|
.b_wen ( iv_wen [1*1+:1] ),
|
||||||
|
.b_addr ( iv_addr [1*8+:8] ),
|
||||||
|
.b_wdata ( iv_wdata[1*8+:8] ),
|
||||||
|
.b_rdata ( ov_rdata[1*8+:8] )
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
||||||
|
// Dual-Port L1 Memory Implementation
|
||||||
|
module FooMemImpl(
|
||||||
|
input a_clk,
|
||||||
|
input a_wen,
|
||||||
|
input [7:0] a_addr,
|
||||||
|
input [7:0] a_wdata,
|
||||||
|
output [7:0] a_rdata,
|
||||||
|
|
||||||
|
input b_clk,
|
||||||
|
input b_wen,
|
||||||
|
input [7:0] b_addr,
|
||||||
|
input [7:0] b_wdata,
|
||||||
|
output [7:0] b_rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
/* verilator lint_off MULTIDRIVEN */
|
||||||
|
reg [7:0] mem[0:255];
|
||||||
|
/* verilator lint_on MULTIDRIVEN */
|
||||||
|
|
||||||
|
always @( posedge a_clk )
|
||||||
|
if ( a_wen )
|
||||||
|
mem[a_addr] <= a_wdata;
|
||||||
|
|
||||||
|
always @( posedge b_clk )
|
||||||
|
if ( b_wen )
|
||||||
|
mem[b_addr] <= b_wdata;
|
||||||
|
|
||||||
|
always @( posedge a_clk )
|
||||||
|
a_rdata <= mem[a_addr];
|
||||||
|
|
||||||
|
always @( posedge b_clk )
|
||||||
|
b_rdata <= mem[b_addr];
|
||||||
|
|
||||||
|
endmodule
|
16
test/cli/verilog/t_order_quad.v
Normal file
16
test/cli/verilog/t_order_quad.v
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2014 by Wilson Snyder.
|
||||||
|
|
||||||
|
//bug 762
|
||||||
|
module t(a0, y);
|
||||||
|
input [3:0] a0;
|
||||||
|
output [44:0] y;
|
||||||
|
|
||||||
|
assign y[40] = 0;
|
||||||
|
assign y[30] = 0;
|
||||||
|
// verilator lint_off UNOPTFLAT
|
||||||
|
assign { y[44:41], y[39:31], y[29:0] } = { 6'b000000, a0, 7'b0000000, y[40], y[30], y[30], y[30], y[30], 21'b000000000000000000000 };
|
||||||
|
|
||||||
|
endmodule
|
18
test/cli/verilog/t_order_wireloop.v
Normal file
18
test/cli/verilog/t_order_wireloop.v
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2005 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t (/*AUTOARG*/
|
||||||
|
// Outputs
|
||||||
|
bar
|
||||||
|
);
|
||||||
|
|
||||||
|
wire foo;
|
||||||
|
output bar;
|
||||||
|
|
||||||
|
// Oh dear.
|
||||||
|
assign foo = bar;
|
||||||
|
assign bar = foo;
|
||||||
|
|
||||||
|
endmodule
|
Loading…
Reference in New Issue
Block a user