Because VHDL is hard and should be free.
+── hdl <- Re-usable and reused vhdl
| |
| +── bhv <- Simulation hdl, like clock, reset, ...
| \── rtl <- Synthetizable hdl
|
+── board
| \── mimas <- One directory for each board
| +── ucf <- Hardwired ucf, like leds, buttons, ...
| |
| +── projects
| \── hello_leds <- one directory for each project
| +── ucf <- part of the ucf that change with project
| +── hdl <- code
| +── tb <- testbench
| \── tmp <- build tool crap
|
+── tb
| \── fifo <- one directory for each tb, and at least one tb per hdl entity.
| +── 00_reset <- tb for the reset(s)
| | +── hdl <- here goest the 'tb' entity
| | \── tmp
| +── 01_simple
| \── 02_flags
|
\── travis <- Travis CI scripts
tabs size 4
Signals are generally active high, including the reset. Active-low signals
can be used when they are directly connected to the hardware.
- Test benches are required for all rtl entities.
- Test benches results must be checked using
assert - Successful test benches assert the message
PIM_VHDL_SIMULATION_DONEwith the severitynote. - Expected asserts with severity
warningshould be announced by using an assert starting withPIM_VHDL_SIMULATION_DONE.
All synchronous entities MUST have at least those signals:
- The clock signal is named
clock. - The asynchronous reset signal is named
reset.
Synchronous entities are expected to behave the same when there is no reset, or when there is an asynchronous reset.
Hardware requiring synchronous reset will use a script for converting asynchronous reset to synchronous. This script will be written when there is some need for it, and will do something like:
--- async.vhd
+++ sync.vhd
@@ -1,8 +1,9 @@
-process(reset, clock)
+process(clock)
begin
- if reset = '1' then
- some_signal <= '0';
- elsif rising_edge(clock) then
+ if rising_edge(clock) then
some_signal <= not some_signal;
+ if reset = '1' then
+ some_signal <= '0';
+ end if;
end if;
end process;-
For windows users: install cygwin with at least
git,wgetandunzip. -
Install ghdl and add it to your PATH or let the scripts get it for you.
source bin/env.sh
cd tb/ad7476
sim.shExpected result: ../../hdl/bhv/clock/clock_stop.vhd:52:8:@100875ns:(assertion note): PIM_VHDL_SIMULATION_DONE
source bin/env.sh
cd tb
all.shExpected result:
Running all 'tb' from tb directory
./ad7476/00_reset : success
./fifo/00_reset : success
./fifo/01_reset_preread : success
./fifo/02_flags : success
./ft245_sync_if/00_reset : success
./ft245_sync_if/01_xfer : success
./packetizer/00_reset : success
./project/adc2ftd_02/00_reset : success
./width_changer/00_reset : success
./width_changer/01_bigger : success
./width_changer/02_smaller : success
Running all 'managed_tb' from tb directory without reset
./ad7476/01_simple : success
./fifo/03_simple : success
./fifo/04_preread : success
./ft245_sync_if/02_pingpong : success
./ft245_sync_if/03_counter_to_host : success
./packetizer/01_simple : success
./project/adc2ftd_02/01_full : success
./width_changer/03_full : success
Running all 'managed_tb' from tb directory with asynchronous reset
./ad7476/01_simple : success
./fifo/03_simple : success
./fifo/04_preread : success
./ft245_sync_if/02_pingpong : success
./ft245_sync_if/03_counter_to_host : success
./packetizer/01_simple : success
./project/adc2ftd_02/01_full : success
./width_changer/03_full : success
All test benches are run on Travis CI, at each commit. The status of the latest run is shown after the title of this page.