Gatecheck is a sloppy script which looks for violations of gating requirements (all registers wider than 4 bits must be clock-gated).
Script is intentinally simple, ignoring macro and treating global, cross-module analysis in fast but primitive way.
For info on usage, run
$ gatecheck.pl --help
TODO (must):
- merge splitted definition of module inputs/outputs e.g.
module mod(input x);
reg [2:0] x;
TODO (may):
- parse concatenations in NBAs i.e.
{x,y} <= ...
- respect parameter assignments in module instantiations
- delay warning till parameter is actually used to calculate some register width
- evaluate more types of expressions (indexing,
clog2()
, etc.)
Known issues:
- global parameter matching algorithm is extremely naive so may easily match wrong parameters (seems to be precise enough for current sources though)
- declaration of same register under different branches of macro or parameter condition will result in "duplicate declaration" warnings:
`ifdef AMBER_WISHBONE_DEBUG
reg [7:0] jitter_r = 8'h0f;
reg [1:0] start_read_r = 'd0;
`else
reg start_read_r = 'd0;
`endif
- declaration of same register in tasks will result in "duplicate declarations" warnings
- macro in the middle of construct will break parsing:
module test(
output ddr3_ck_n,
`ifdef XILINX_SPARTAN6_FPGA
inout mcb3_rzq,
`endif
);
- macro definition of range will cause parse errors:
wire [`MY_SIZE] x;
- Verilog attributes are not parsed:
(* keep = "true", max_fanout = 30 *) output reg [DATA_WIDTH-1:0] data;
- delays are not parsed:
r <= #25 0;
wire #1 cpci_rd_wr_L;