Automatically dump signals
While manually dumping signals with a macro works OK for standalone modules, it doesn't work when multiple modules are included. Instead, create a second top-level module to dump signals. Inspired (once again) by [1]. [1] https://github.com/steveicarus/iverilog/issues/376#issuecomment-709907692 Signed-off-by: Sean Anderson <seanga2@gmail.com>
This commit is contained in:
parent
5ac40dbea2
commit
3ec1f4d77d
19
Makefile
19
Makefile
|
@ -22,9 +22,7 @@ log:
|
||||||
$(SYNTH) -q -E $@.d -p "synth_ice40 -top $(*F)" -b json -o $@ -f verilog $< -l log/$(*F).synth
|
$(SYNTH) -q -E $@.d -p "synth_ice40 -top $(*F)" -b json -o $@ -f verilog $< -l log/$(*F).synth
|
||||||
|
|
||||||
define run-jsontov =
|
define run-jsontov =
|
||||||
( echo '`include "common.vh"'; grep timescale $*.v; \
|
( grep timescale $*.v; $(SYNTH) -q -p "write_verilog -defparam -noattr" -f json $< ) > $@
|
||||||
$(SYNTH) -q -p "write_verilog -defparam -noattr" -f json $< ) | \
|
|
||||||
sed 's/endmodule/`DUMP(1)\n\0/g' > $@
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
%.synth.v: %.synth.json %.v
|
%.synth.v: %.synth.json %.v
|
||||||
|
@ -35,28 +33,29 @@ endef
|
||||||
|
|
||||||
# Don't warn about including the timescale from common.vh
|
# Don't warn about including the timescale from common.vh
|
||||||
IFLAGS := -g2012 -gspecify -Wall -Wno-timescale
|
IFLAGS := -g2012 -gspecify -Wall -Wno-timescale
|
||||||
|
EXTRA_V := rtl/iverilog_dump.v
|
||||||
|
|
||||||
define run-icarus =
|
define run-icarus =
|
||||||
$(ICARUS) $(IFLAGS) -I$(<D) -M$@.pre -s $(TOP) -o $@ $< $(EXTRA_V) && \
|
$(ICARUS) $(IFLAGS) -I$(<D) -y$(<D) -M$@.pre -DTOP=$(TOP) -s $(TOP) -s dump -o $@ $< $(EXTRA_V) && \
|
||||||
( echo -n "$@: " && tr '\n' ' ' ) < $@.pre > $@.d; RET=$$?; rm -f $@.pre; exit $$RET
|
( echo -n "$@: " && tr '\n' ' ' ) < $@.pre > $@.d; RET=$$?; rm -f $@.pre; exit $$RET
|
||||||
endef
|
endef
|
||||||
|
|
||||||
%.vvp: TOP = $(*F)
|
%.vvp: TOP = $(*F)
|
||||||
%.vvp: %.v
|
%.vvp: %.v rtl/iverilog_dump.v
|
||||||
$(run-icarus)
|
$(run-icarus)
|
||||||
|
|
||||||
%.synth.vvp: TOP = $(*F)
|
%.synth.vvp: TOP = $(*F)
|
||||||
%.synth.vvp %.place.vvp: EXTRA_V := $(shell $(SYNTH)-config --datdir)/ice40/cells_sim.v
|
%.synth.vvp %.place.vvp: EXTRA_V += $(shell $(SYNTH)-config --datdir)/ice40/cells_sim.v
|
||||||
# Don't warn about unused SB_IO ports
|
# Don't warn about unused SB_IO ports
|
||||||
%.synth.vvp: IFLAGS += -Wno-portbind
|
%.synth.vvp: IFLAGS += -Wno-portbind
|
||||||
%.synth.vvp: %.synth.v
|
%.synth.vvp: %.synth.v rtl/iverilog_dump.v
|
||||||
$(run-icarus)
|
$(run-icarus)
|
||||||
|
|
||||||
%.place.vvp: TOP = top
|
%.place.vvp: TOP = top
|
||||||
# Don't warn about unused SB_IO ports
|
# Don't warn about unused SB_IO ports
|
||||||
%.place.vvp: IFLAGS += -Wno-portbind
|
%.place.vvp: IFLAGS += -Wno-portbind
|
||||||
%.place.vvp: IFLAGS += -DTIMING -Ttyp
|
%.place.vvp: IFLAGS += -DTIMING -Ttyp
|
||||||
%.place.vvp: %.place.v
|
%.place.vvp: %.place.v rtl/iverilog_dump.v
|
||||||
$(run-icarus)
|
$(run-icarus)
|
||||||
|
|
||||||
%.asc %.sdf %.place.json &: %.synth.json | log
|
%.asc %.sdf %.place.json &: %.synth.json | log
|
||||||
|
@ -79,13 +78,15 @@ define run-vvp =
|
||||||
MODULE=tb.$* $(VVP) $(VVPFLAGS) $< $(PLUSARGS)
|
MODULE=tb.$* $(VVP) $(VVPFLAGS) $< $(PLUSARGS)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
%.fst: PLUSARGS += +levels=0
|
||||||
%.fst: rtl/%.vvp tb/%.py FORCE
|
%.fst: rtl/%.vvp tb/%.py FORCE
|
||||||
$(run-vvp)
|
$(run-vvp)
|
||||||
|
|
||||||
|
%.synth.fst: PLUSARGS += +levels=1
|
||||||
%.synth.fst: rtl/%.synth.vvp tb/%.py FORCE
|
%.synth.fst: rtl/%.synth.vvp tb/%.py FORCE
|
||||||
$(run-vvp)
|
$(run-vvp)
|
||||||
|
|
||||||
%.place.fst: PLUSARGS += +sdf=rtl/$*.sdf
|
%.place.fst: PLUSARGS += +levels=1 +sdf=rtl/$*.sdf
|
||||||
%.place.fst: rtl/%.place.vvp rtl/%.sdf tb/%.py FORCE
|
%.place.fst: rtl/%.place.vvp rtl/%.sdf tb/%.py FORCE
|
||||||
$(run-vvp)
|
$(run-vvp)
|
||||||
|
|
||||||
|
|
|
@ -9,19 +9,4 @@
|
||||||
`default_nettype none
|
`default_nettype none
|
||||||
`timescale 1ns/1ns
|
`timescale 1ns/1ns
|
||||||
|
|
||||||
`ifdef SYNTHESIS
|
|
||||||
`define DUMP(levels)
|
|
||||||
`else
|
|
||||||
`define DUMP(levels) \
|
|
||||||
reg [4096:0] vcdfile, sdffile; \
|
|
||||||
initial begin \
|
|
||||||
if ($value$plusargs("vcd=%s", vcdfile)) begin \
|
|
||||||
$dumpfile(vcdfile); \
|
|
||||||
$dumpvars(levels); \
|
|
||||||
end \
|
|
||||||
if ($value$plusargs("sdf=%s", sdffile)) \
|
|
||||||
$sdf_annotate(sdffile); \
|
|
||||||
end
|
|
||||||
`endif
|
|
||||||
|
|
||||||
`endif /* COMMON_VH */
|
`endif /* COMMON_VH */
|
||||||
|
|
|
@ -115,6 +115,4 @@ module descramble (
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-Only
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Sean Anderson <seanga2@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
module iverilog_dump();
|
||||||
|
integer levels;
|
||||||
|
reg [4096:0] vcdfile, sdffile;
|
||||||
|
initial begin
|
||||||
|
if ($value$plusargs("vcd=%s", vcdfile) &&
|
||||||
|
$value$plusargs("levels=%d", levels)) begin
|
||||||
|
$dumpfile(vcdfile);
|
||||||
|
$dumpvars(levels, `TOP);
|
||||||
|
end
|
||||||
|
if ($value$plusargs("sdf=%s", sdffile))
|
||||||
|
$sdf_annotate(sdffile, `TOP);
|
||||||
|
end
|
||||||
|
endmodule
|
|
@ -216,6 +216,4 @@ module mdio (
|
||||||
end
|
end
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -78,6 +78,4 @@ module mdio_io (
|
||||||
oe <= 0;
|
oe <= 0;
|
||||||
end
|
end
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -149,6 +149,4 @@ module mdio_regs (
|
||||||
data_read <= data_read_next;
|
data_read <= data_read_next;
|
||||||
end
|
end
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -121,6 +121,4 @@ module mii_io_rx (
|
||||||
end
|
end
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -113,6 +113,4 @@ module mii_io_tx (
|
||||||
end
|
end
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -34,6 +34,4 @@ module nrzi_decode (
|
||||||
nrz <= nrz_next;
|
nrz <= nrz_next;
|
||||||
end
|
end
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -20,6 +20,4 @@ module nrzi_encode (
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
nrzi <= nrzi_next;
|
nrzi <= nrzi_next;
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -90,8 +90,6 @@ module pcs (
|
||||||
assign col = transmitting && receiving;
|
assign col = transmitting && receiving;
|
||||||
assign crs = transmitting || receiving;
|
assign crs = transmitting || receiving;
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
/* Transmit process */
|
/* Transmit process */
|
||||||
|
|
|
@ -213,6 +213,4 @@ module pmd_io (
|
||||||
end
|
end
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -23,6 +23,4 @@ module scramble (
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
lfsr = { lfsr[9:0], lfsr_next };
|
lfsr = { lfsr[9:0], lfsr_next };
|
||||||
|
|
||||||
`DUMP(0)
|
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
Loading…
Reference in New Issue