summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hdl_lab/Makefile2
-rw-r--r--hdl_lab/hdl/constants.py5
-rw-r--r--hdl_lab/hdl/myhdl_wrap.py31
-rw-r--r--hdl_lab/hdl/shift_reg.py1
-rw-r--r--hdl_lab/hdl/template.py67
5 files changed, 104 insertions, 2 deletions
diff --git a/hdl_lab/Makefile b/hdl_lab/Makefile
index c40b1cf..a85bbd8 100644
--- a/hdl_lab/Makefile
+++ b/hdl_lab/Makefile
@@ -10,4 +10,4 @@ test-w:
py.test -v $(HDL)
clean:
- $(RM) -rf simulation/* gen_verilog/* __pycache__/* .pytest_cache/* \ No newline at end of file
+ $(RM) -rf simulation/* gen_verilog/* hdl/__pycache__/* .pytest_cache/* \ No newline at end of file
diff --git a/hdl_lab/hdl/constants.py b/hdl_lab/hdl/constants.py
new file mode 100644
index 0000000..d40d7c1
--- /dev/null
+++ b/hdl_lab/hdl/constants.py
@@ -0,0 +1,5 @@
+SIM_DIR = './simulation/'
+GEN_VERILOG = './gen_verilog/'
+
+IVERILOG = 'iverilog '
+VVP = 'vvp -M ./ -m myhdl ' \ No newline at end of file
diff --git a/hdl_lab/hdl/myhdl_wrap.py b/hdl_lab/hdl/myhdl_wrap.py
new file mode 100644
index 0000000..2e8fe4e
--- /dev/null
+++ b/hdl_lab/hdl/myhdl_wrap.py
@@ -0,0 +1,31 @@
+import os
+from myhdl import *
+from constants import *
+
+class Myhdl_Wrapper():
+ def __init__(self):
+ self.class_name = self.__class__.__name__
+
+ def _export(self, **kargs):
+ inst = getattr(self, self.class_name)(**kargs)
+ inst.convert(hdl='Verilog', path=GEN_VERILOG, name=f"{self.class_name}")
+
+
+
+ # This function links myhdl to icarus verilog sim
+ def _cosim(self, **kargs): #these should have the same signals as logic(),
+
+ iverilog_cmd = IVERILOG + f"-o {SIM_DIR}{self.class_name}.o {GEN_VERILOG}{self.class_name}.v {GEN_VERILOG}tb_{self.class_name}.v"
+ vvp_cmd = VVP + f"{SIM_DIR}{self.class_name}.o"
+
+ os.system(iverilog_cmd)
+ return Cosimulation(vvp_cmd, **kargs)
+
+ def sim(self):
+ tb = self.tb(getattr(self, self.class_name))
+ tb.config_sim(trace=True, tracebackup=False, directory=SIM_DIR, filename=f"{self.class_name}_sim")
+ tb.run_sim()
+
+ def cosim(self):
+ tb = self.tb(self._cosim)
+ tb.run_sim() \ No newline at end of file
diff --git a/hdl_lab/hdl/shift_reg.py b/hdl_lab/hdl/shift_reg.py
index 28914f1..d463a9f 100644
--- a/hdl_lab/hdl/shift_reg.py
+++ b/hdl_lab/hdl/shift_reg.py
@@ -1,4 +1,3 @@
-from turtle import width
from myhdl import *
from myhdl_wrap import Myhdl_Wrapper
diff --git a/hdl_lab/hdl/template.py b/hdl_lab/hdl/template.py
new file mode 100644
index 0000000..09a6f7f
--- /dev/null
+++ b/hdl_lab/hdl/template.py
@@ -0,0 +1,67 @@
+from typing import Callable
+from myhdl import *
+from myhdl_wrap import Myhdl_Wrapper
+
+import random
+from random import randint
+
+random.seed(63)
+
+class Template(Myhdl_Wrapper):
+ def __init__(self):
+ super().__init__()
+
+ # Main code, this is the actual logic
+ @staticmethod
+ @block
+ def Template(args): # this must be the same name as the class name
+
+ @instance
+ def logic():
+ ...
+
+ return logic
+
+
+ @block
+ def tb(self, func: Callable):
+ reset = Signal(False)
+ clk = Signal(bool(0))
+ ...
+
+ dut = func(..., clk=clk, reset=reset)
+
+ @always(delay(...))
+ def clock_gen():
+ clk.next = not clk
+
+ @instance
+ def monitor():
+ ...
+
+ @instance
+ def stimulus():
+ ...
+
+ raise StopSimulation
+
+
+ return dut, clock_gen, monitor, stimulus
+
+ def export(self):
+ reset = Signal(False)
+ clk = Signal(bool(0))
+ ...
+
+ # assigning signals, kargs only
+ self._export(..., clk=clk, reset=reset)
+
+
+def test_template_sim():
+ hdl = Template()
+ hdl.sim()
+
+def test_template_cosim():
+ hdl = Template()
+ hdl.export()
+ hdl.cosim()