summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--.vscode/configurationCache.log1
-rw-r--r--.vscode/dryrun.log6
-rw-r--r--.vscode/launch.json16
-rw-r--r--.vscode/settings.json3
-rw-r--r--.vscode/targets.log371
-rw-r--r--hdl/testing/shift_reg.py100
-rw-r--r--hdl/testing/up_counter.py50
-rw-r--r--hdl/testing/up_counter_tb.py30
-rw-r--r--requirements.txt1
10 files changed, 585 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index c1e087a..1642c9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,9 @@
*.pdf
-.vscode/
-env/
+.venv
__pycache__/
+*quartus
+*.v
+*.vcd
+*.cc
+*.bak
+*.pytest_cache \ No newline at end of file
diff --git a/.vscode/configurationCache.log b/.vscode/configurationCache.log
new file mode 100644
index 0000000..bab9054
--- /dev/null
+++ b/.vscode/configurationCache.log
@@ -0,0 +1 @@
+{"buildTargets":[],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}} \ No newline at end of file
diff --git a/.vscode/dryrun.log b/.vscode/dryrun.log
new file mode 100644
index 0000000..e3eafb1
--- /dev/null
+++ b/.vscode/dryrun.log
@@ -0,0 +1,6 @@
+make --dry-run --always-make --keep-going --print-directory
+make: Entering directory '/home/jon/github/ASAP32'
+make: Leaving directory '/home/jon/github/ASAP32'
+
+make: *** No targets specified and no makefile found. Stop.
+
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..306f58e
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,16 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Python: Current File",
+ "type": "python",
+ "request": "launch",
+ "program": "${file}",
+ "console": "integratedTerminal",
+ "justMyCode": true
+ }
+ ]
+} \ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..65e1ec0
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "makefile.extensionOutputFolder": "./.vscode"
+} \ No newline at end of file
diff --git a/.vscode/targets.log b/.vscode/targets.log
new file mode 100644
index 0000000..5f84ce2
--- /dev/null
+++ b/.vscode/targets.log
@@ -0,0 +1,371 @@
+make all --print-data-base --no-builtin-variables --no-builtin-rules --question
+# GNU Make 4.3
+# Built for x86_64-suse-linux-gnu
+# Copyright (C) 1988-2020 Free Software Foundation, Inc.
+# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+# This is free software: you are free to change and redistribute it.
+# There is NO WARRANTY, to the extent permitted by law.
+
+# Make data base, printed on Thu Aug 4 22:49:23 2022
+
+# Variables
+
+# environment
+JAVA_HOME = /usr/lib64/jvm/java
+# environment
+QEMU_AUDIO_DRV = pa
+# environment
+GDK_BACKEND = x11
+# environment
+LC_ALL = C
+# environment
+NO_AT_BRIDGE = 1
+# environment
+GTK_RC_FILES = /etc/gtk/gtkrc:/home/jon/.gtkrc:/home/jon/.config/gtkrc
+# environment
+WINDOWMANAGER = /usr/bin/startplasma-x11
+# environment
+VSCODE_CWD = /home/jon/github
+# environment
+GPG_TTY = not a tty
+# environment
+MACHTYPE = x86_64-suse-linux
+# default
+MAKE_COMMAND := make
+# automatic
+@D = $(patsubst %/,%,$(dir $@))
+# environment
+PYTHONSTARTUP = /etc/pythonstart
+# environment
+VSCODE_HANDLES_UNCAUGHT_ERRORS = true
+# default
+.VARIABLES :=
+# environment
+PWD = /home/jon/github/ASAP32
+# environment
+HOST = WarpDrive
+# automatic
+%D = $(patsubst %/,%,$(dir $%))
+# environment
+MORE = -sl
+# environment
+HOSTNAME = WarpDrive
+# environment
+MAIL = /var/spool/mail/jon
+# environment
+XNLSPATH = /usr/share/X11/nls
+# environment
+XDG_DATA_DIRS = /home/jon/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/share
+# automatic
+^D = $(patsubst %/,%,$(dir $^))
+# automatic
+%F = $(notdir $%)
+# environment
+QML_XHR_ALLOW_FILE_READ = 1
+# environment
+VSCODE_CODE_CACHE_PATH = /home/jon/.config/Code/CachedData/3b889b090b5ad5793f524b5d1d39fda662b96a2a
+# environment
+XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session0
+# environment
+PROFILEREAD = true
+# environment
+SSH_ASKPASS = /usr/libexec/ssh/ssh-askpass
+# environment
+LANG = C
+# environment
+XAUTHORITY = /run/user/1000/xauth_jFUnMm
+# environment
+MANPATHISSET = yes
+# default
+.LOADED :=
+# environment
+FROM_HEADER =
+# default
+.INCLUDE_DIRS = /usr/include /usr/local/include /usr/include
+# makefile
+MAKEFLAGS = pqrR
+# makefile
+CURDIR := /home/jon/github/ASAP32
+# environment
+APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL = 1
+# environment
+LESSOPEN = lessopen.sh %s
+# automatic
+*D = $(patsubst %/,%,$(dir $*))
+# environment
+MFLAGS = -pqrR
+# environment
+SSH_AUTH_SOCK = /tmp/ssh-XXXXXX6Sy2Am/agent.1730
+# default
+.SHELLFLAGS := -c
+# environment
+HISTSIZE = 1000
+# environment
+XDG_CONFIG_DIRS = /home/jon/.config/kdedefaults:/etc/xdg:/usr/etc/xdg
+# automatic
++D = $(patsubst %/,%,$(dir $+))
+# environment
+XCURSOR_THEME = Qogir-dark
+# environment
+LESSKEY = /usr/etc/lesskey.bin
+# environment
+XDG_SESSION_DESKTOP = KDE
+# makefile
+MAKEFILE_LIST :=
+# automatic
+@F = $(notdir $@)
+# environment
+VSCODE_PID = 4695
+# environment
+XDG_SESSION_TYPE = x11
+# environment
+XAUTHLOCALHOSTNAME = WarpDrive
+# automatic
+?D = $(patsubst %/,%,$(dir $?))
+# environment
+INPUT_METHOD = ibus
+# environment
+SDK_HOME = /usr/lib64/jvm/java
+# environment
+SESSION_MANAGER = local/WarpDrive:@/tmp/.ICE-unix/2082,unix/WarpDrive:/tmp/.ICE-unix/2082
+# automatic
+*F = $(notdir $*)
+# environment
+MANPATH = /home/jon/.local/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man:/opt/cross/share/man
+# environment
+CHROME_DESKTOP = code-url-handler.desktop
+# environment
+DBUS_SESSION_BUS_ADDRESS = unix:abstract=/tmp/dbus-ymHqyeMEWm,guid=17b1d60c93f024c3f95adad862e5d7e3
+# automatic
+<D = $(patsubst %/,%,$(dir $<))
+# environment
+JAVA_ROOT = /usr/lib64/jvm/java
+# environment
+LESS_ADVANCED_PREPROCESSOR = no
+# environment
+JAVA_BINDIR = /usr/lib64/jvm/java/bin
+# environment
+VSCODE_NLS_CONFIG = {"locale":"en-us","availableLanguages":{},"_languagePackSupport":true}
+# default
+MAKE_HOST := x86_64-suse-linux-gnu
+# environment
+WINDOW_MANAGER = /usr/bin/startplasma-x11
+# makefile
+SHELL = /bin/sh
+# default
+MAKECMDGOALS := all
+# environment
+XMODIFIERS = @im=ibus
+# environment
+PLATFORMIO_CALLER = vscode
+# environment
+SHLVL = 0
+# environment
+MAKELEVEL := 0
+# default
+MAKE = $(MAKE_COMMAND)
+# environment
+PATH = /home/jon/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/cross/bin
+# default
+MAKEFILES :=
+# automatic
+^F = $(notdir $^)
+# environment
+OSTYPE = linux
+# environment
+QSYS_ROOTDIR = /storage/large_programs/quartus/sopc_builder/bin
+# environment
+MINICOM = -c on
+# environment
+CPU = x86_64
+# environment
+LESSCLOSE = lessclose.sh %s %s
+# automatic
+?F = $(notdir $?)
+# environment
+KDE_APPLICATIONS_AS_SCOPE = 1
+# environment
+XDG_SEAT = seat0
+# environment
+XSESSION_IS_UP = yes
+# environment
+GTK_IM_MODULE = ibus
+# environment
+NO_PROXY = 127.0.0.1
+# environment
+XDG_CURRENT_DESKTOP = KDE
+# environment
+HOSTTYPE = x86_64
+# environment
+LS_COLORS = rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.pdf=00;32:*.ps=00;32:*.txt=00;32:*.patch=00;32:*.diff=00;32:*.log=00;32:*.tex=00;32:*.doc=00;32:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
+# automatic
++F = $(notdir $+)
+# environment
+XDG_SEAT_PATH = /org/freedesktop/DisplayManager/Seat0
+# environment
+LESS = -M -I -R
+# environment
+DESKTOP_SESSION = /usr/share/xsessions/default
+# environment
+CONFIG_SITE = /usr/share/site/x86_64-pc-linux-gnu
+# environment
+ORIGINAL_XDG_CURRENT_DESKTOP = KDE
+# 'override' directive
+GNUMAKEFLAGS :=
+# environment
+LOGNAME = jon
+# environment
+QT_IM_SWITCHER = imsw-multi
+# environment
+AUDIODRIVER = pulseaudio
+# environment
+G_FILENAME_ENCODING = @locale,UTF-8,ISO-8859-15,CP1252
+# environment
+PLATFORMIO_PATH = /home/jon/.platformio/python3/bin:/home/jon/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/cross/bin
+# environment
+XDG_VTNR = 7
+# makefile
+.DEFAULT_GOAL :=
+# environment
+DISPLAY = :0
+# environment
+GTK_MODULES = canberra-gtk-module:canberra-gtk-module
+# environment
+USER = jon
+# default
+MAKE_VERSION := 4.3
+# environment
+KDE_SESSION_UID = 1000
+# environment
+SSH_AGENT_PID = 1894
+# environment
+PAGER = less
+# environment
+_ = /usr/bin/make
+# environment
+XDG_RUNTIME_DIR = /run/user/1000
+# environment
+G_BROKEN_FILENAMES = 1
+# environment
+XDG_SESSION_CLASS = user
+# environment
+VSCODE_AMD_ENTRYPOINT = vs/workbench/api/node/extensionHostProcess
+# environment
+PLATFORMIO_IDE = 2.5.1
+# environment
+XKEYSYMDB = /usr/X11R6/lib/X11/XKeysymDB
+# environment
+GTK2_RC_FILES = /etc/gtk-2.0/gtkrc:/home/jon/.gtkrc-2.0:/home/jon/.config/gtkrc-2.0
+# environment
+HOME = /home/jon
+# environment
+QT_IM_MODULE = ibus
+# environment
+CSHEDIT = emacs
+# environment
+JDK_HOME = /usr/lib64/jvm/java
+# environment
+ELECTRON_RUN_AS_NODE = 1
+# environment
+VSCODE_IPC_HOOK = /run/user/1000/vscode-74f3b1db-1.69.2-main.sock
+# environment
+TERM = xterm
+# environment
+XDG_SESSION_ID = 1
+# environment
+XCURSOR_SIZE = 24
+# environment
+STARTUP = /usr/bin/startplasma-x11
+# default
+.RECIPEPREFIX :=
+# automatic
+<F = $(notdir $<)
+# default
+SUFFIXES :=
+# environment
+QT_AUTO_SCREEN_SCALE_FACTOR = 0
+# environment
+LS_OPTIONS = -N --color=tty -T 0
+# environment
+KDE_SESSION_VERSION = 5
+# default
+.FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell nocomment grouped-target extra-prereqs archives jobserver output-sync check-symlink load
+# environment
+QT4_IM_MODULE = xim
+# environment
+KDE_FULL_SESSION = true
+# environment
+
+make: *** No rule to make target 'all'. Stop.
+
+JRE_HOME = /usr/lib64/jvm/java
+# variable set hash-table stats:
+# Load=143/1024=14%, Rehash=0, Collisions=13/170=8%
+
+# Pattern-specific Variable Values
+
+# No pattern-specific variable values.
+
+# Directories
+
+# . (device 65025, inode 21757987): 10 files, no impossibilities.
+
+# 10 files, no impossibilities in 1 directories.
+
+# Implicit Rules
+
+# No implicit rules.
+
+# Files
+
+# Not a target:
+Makefile:
+# Implicit rule search has been done.
+# File does not exist.
+# File has been updated.
+# Failed to be updated.
+
+# Not a target:
+.DEFAULT:
+# Implicit rule search has not been done.
+# Modification time never checked.
+# File has not been updated.
+
+# Not a target:
+all:
+# Command line target.
+# Implicit rule search has been done.
+# File does not exist.
+# File has not been updated.
+
+# Not a target:
+makefile:
+# Implicit rule search has been done.
+# File does not exist.
+# File has been updated.
+# Failed to be updated.
+
+# Not a target:
+GNUmakefile:
+# Implicit rule search has been done.
+# File does not exist.
+# File has been updated.
+# Failed to be updated.
+
+# files hash-table stats:
+# Load=6/1024=1%, Rehash=0, Collisions=0/15=0%
+# VPATH Search Paths
+
+# No 'vpath' search paths.
+
+# No general ('VPATH' variable) search path.
+
+# strcache buffers: 1 (0) / strings = 18 / storage = 147 B / avg = 8 B
+# current buf: size = 8162 B / used = 147 B / count = 18 / avg = 8 B
+
+# strcache performance: lookups = 21 / hit rate = 14%
+# hash-table stats:
+# Load=18/8192=0%, Rehash=0, Collisions=0/21=0%
+# Finished Make data base on Thu Aug 4 22:49:23 2022
+
+
diff --git a/hdl/testing/shift_reg.py b/hdl/testing/shift_reg.py
new file mode 100644
index 0000000..b7c2290
--- /dev/null
+++ b/hdl/testing/shift_reg.py
@@ -0,0 +1,100 @@
+import sys
+from amaranth import *
+from amaranth.back import verilog, cxxrtl
+from amaranth.cli import main
+from amaranth.sim import Simulator, Settle, Delay
+
+BASENAME = "shift_reg"
+
+class ShiftReg(Elaboratable):
+ def __init__(self, width):
+ self.load_val = Signal(width, reset=0, reset_less=True)
+ self.load = Signal()
+ self.reg = Signal(width)
+ self.en = Signal()
+ self.right_left = Signal()
+
+ self.ports = [self.load_val, self.en, self.right_left, self.reg]
+
+ def elaborate(self, platform):
+ m = Module()
+
+ with m.If(self.load):
+ m.d.sync += self.reg.eq(self.load_val)
+ with m.Else():
+ with m.If(self.en):
+ with m.If(self.right_left):
+ m.d.sync += self.reg.eq(self.reg << 1)
+ with m.Else():
+ m.d.sync += self.reg.eq(self.reg >> 1)
+
+ return m
+
+
+def step():
+ yield
+ yield Settle()
+
+def test_shift_reg():
+ dut = ShiftReg(8)
+
+ def proc1():
+ val = 0xAB
+
+ yield dut.load_val.eq(val)
+ yield dut.en.eq(0)
+ yield dut.load.eq(1)
+ yield
+ yield Settle()
+ yield dut.load.eq(0)
+ yield dut.en.eq(1)
+
+ for _ in range(9):
+ reg_val = yield dut.reg
+ assert reg_val == val, f"Incorrect shift ---EXPECTED: {hex(val)} ---GOT: {hex(reg_val)}"
+ val = val >> 1
+ yield
+ yield Settle()
+
+ val = 0xBD
+ yield dut.load_val.eq(val)
+ yield dut.load.eq(1)
+ yield dut.right_left.eq(1)
+ yield
+ yield Settle()
+ yield dut.load.eq(0)
+
+ for _ in range(9):
+ reg_val = yield dut.reg
+ assert reg_val == val, f"Incorrect shift ---EXPECTED: {hex(val)} ---GOT: {hex(reg_val)}"
+ val = (val << 1) & 0xff
+ yield
+ yield Settle()
+
+
+
+ sim = Simulator(dut)
+ sim.add_clock(1e-6)
+ sim.add_sync_process(proc1)
+
+ with sim.write_vcd(BASENAME + '.vcd'):
+ sim.run()
+
+
+if __name__ == '__main__':
+
+ if sys.argv[1] == "sim":
+ test_shift_reg()
+ exit()
+
+ m = ShiftReg(8)
+
+ if sys.argv[1] == "v":
+ out = verilog.convert(m, ports=m.ports)
+ with open(BASENAME + '.v','w') as f:
+ f.write(out)
+
+ elif sys.argv[1] == "cc":
+ out = cxxrtl.convert(m, ports=m.ports)
+ with open(BASENAME + '.cc','w') as f:
+ f.write(out)
diff --git a/hdl/testing/up_counter.py b/hdl/testing/up_counter.py
new file mode 100644
index 0000000..050a6b0
--- /dev/null
+++ b/hdl/testing/up_counter.py
@@ -0,0 +1,50 @@
+from amaranth import *
+from amaranth.back import verilog
+
+
+class UpCounter(Elaboratable):
+ """
+ A 16-bit up counter with a fixed limit.
+
+ Parameters
+ ----------
+ limit : int
+ The value at which the counter overflows.
+
+ Attributes
+ ----------
+ en : Signal, in
+ The counter is incremented if ``en`` is asserted, and retains
+ its value otherwise.
+ ovf : Signal, out
+ ``ovf`` is asserted when the counter reaches its limit.
+ """
+
+ def __init__(self, limit):
+ self.limit = limit
+
+ # Ports
+ self.en = Signal()
+ self.ovf = Signal()
+
+ # State
+ self.count = Signal(16)
+
+ def elaborate(self, platform):
+ m = Module()
+
+ m.d.comb += self.ovf.eq(self.count == self.limit)
+
+ with m.If(self.en):
+ with m.If(self.ovf):
+ m.d.sync += self.count.eq(0)
+ with m.Else():
+ m.d.sync += self.count.eq(self.count + 1)
+
+ return m
+
+ def to_v(self):
+ return verilog.convert(self, ports=[self.en, self.ovf])
+
+top = UpCounter(25)
+print(top.to_v()) \ No newline at end of file
diff --git a/hdl/testing/up_counter_tb.py b/hdl/testing/up_counter_tb.py
new file mode 100644
index 0000000..7c2e8d2
--- /dev/null
+++ b/hdl/testing/up_counter_tb.py
@@ -0,0 +1,30 @@
+from amaranth.sim import Simulator
+from up_counter import UpCounter
+
+dut = UpCounter(25)
+
+
+def bench():
+ # Disabled counter should not overflow.
+ yield dut.en.eq(0)
+ for _ in range(30):
+ yield
+ assert not (yield dut.ovf)
+
+ # Once enabled, the counter should overflow in 25 cycles.
+ yield dut.en.eq(1)
+ for _ in range(25):
+ yield
+ assert not (yield dut.ovf)
+ yield
+ assert (yield dut.ovf)
+
+ # The overflow should clear in one cycle.
+ yield
+ assert not (yield dut.ovf)
+
+sim = Simulator(dut)
+sim.add_clock(1e-6) # 1 MHz
+sim.add_sync_process(bench)
+with sim.write_vcd("up_counter.vcd"):
+ sim.run() \ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..c920901
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+amaranth[builtin-yosys] \ No newline at end of file