2015-04-22 00:28:46 -04:00
|
|
|
import unittest
|
|
|
|
import subprocess
|
|
|
|
import os
|
|
|
|
|
|
|
|
from migen.fhdl.std import *
|
|
|
|
from migen.fhdl.verilog import convert
|
|
|
|
|
|
|
|
|
2015-04-24 06:00:46 -04:00
|
|
|
# Create a module with some combinatorial, some sequential, and some simple
|
|
|
|
# assigns
|
|
|
|
class SyntaxModule(Module):
|
2015-04-22 00:28:46 -04:00
|
|
|
def __init__(self):
|
|
|
|
x = [Signal(8) for y in range(10)]
|
|
|
|
y = [Signal(8) for z in range(10)]
|
|
|
|
en = Signal()
|
|
|
|
a = Signal()
|
|
|
|
b = Signal()
|
|
|
|
z = Signal()
|
|
|
|
as_src = Signal(16);
|
|
|
|
as_tgt1 = Signal(16);
|
|
|
|
as_tgt2 = Signal(16);
|
|
|
|
self.io = {a, b, z, en, as_src, as_tgt1, as_tgt2}
|
|
|
|
|
|
|
|
self.comb += If(a, z.eq(b))
|
|
|
|
self.comb += as_tgt1.eq(as_src)
|
|
|
|
self.comb += as_tgt2.eq(100)
|
|
|
|
for xi in x:
|
|
|
|
self.io.add(xi)
|
|
|
|
for xi in range(1, len(x)):
|
|
|
|
self.comb += If(en, y[xi].eq(x[xi-1])).Else(y[xi].eq(x[xi]))
|
|
|
|
self.sync += x[xi].eq(y[xi])
|
|
|
|
|
|
|
|
|
|
|
|
# Create unit test to build module, run Verilator and check for errors
|
2015-04-24 06:00:46 -04:00
|
|
|
class SyntaxCase(unittest.TestCase):
|
|
|
|
def base_test(self, name, asic_syntax, options=[]):
|
|
|
|
filename = "test_module_{}.v".format(name)
|
|
|
|
t = SyntaxModule()
|
|
|
|
c = convert(t, t.io, name="test_module", asic_syntax=asic_syntax)
|
|
|
|
f = open(filename, "w")
|
|
|
|
f.write(str(c))
|
|
|
|
f.close()
|
|
|
|
subprocess.check_call("verilator --lint-only " + " ".join(options) + " " + filename,
|
2015-04-22 00:28:46 -04:00
|
|
|
stdout=subprocess.DEVNULL,
|
|
|
|
stderr=subprocess.DEVNULL, shell=True)
|
|
|
|
os.unlink(filename)
|
|
|
|
|
2015-04-24 06:00:46 -04:00
|
|
|
def test_generic_syntax(self):
|
|
|
|
options = [
|
|
|
|
"-Wno-WIDTH",
|
|
|
|
"-Wno-COMBDLY",
|
|
|
|
"-Wno-INITIALDLY"
|
|
|
|
]
|
|
|
|
self.base_test("generic", False, options)
|
|
|
|
|
|
|
|
def test_asic_syntax(self):
|
|
|
|
options = [
|
|
|
|
"-Wno-WIDTH", # XXX should we improve ASIC backend to remove this?
|
|
|
|
]
|
|
|
|
self.base_test("asic", True, options)
|