Estoy tratando de usar una aserción concurrente en una declaración de entidad para imponer una restricción mínima de ancho de pulso. Todo funciona como se espera si uso una aserción secuencial dentro de un proceso pasivo:
testest.vhdl
entity testcase is
port(clk: in bit);
begin
check: process is
begin
-- Require at least 10ns between clock edges
assert clk'delayed'last_event >= 10 ns;
wait on clk;
end process check;
end entity testcase;
-- Keep the compiler happy
architecture empty of testcase is
begin
end architecture empty;
testcase_testbench.vhdl
entity testcase_testbench is
end entity testcase_testbench;
architecture bench of testcase_testbench is
signal clk: bit;
begin
dut: entity work.testcase(empty) port map(clk => clk);
stimulus: process is
begin
-- Valid low and high pulses
clk <= '0';
wait for 10 ns;
clk <= '1';
wait for 10 ns;
-- Confirm that we're timing events, not transactions
clk <= '1';
wait for 5 ns;
-- Now send a short pulse to make the assertion fire
clk <= '0';
wait for 5 ns;
-- Assertion should fire here, at 30ns
clk <= '1';
wait;
end process stimulus;
end architecture bench;
Construir y probar:
$ ghdl -a testcase.vhdl
$ ghdl -a testcase_testbench.vhdl
$ ghdl -e testcase_testbench
$ ghdl -r testcase_testbench
testcase.vhdl:6:16:@30ns:(assertion error): Assertion violation
Sin embargo, si trato de usar una aserción concurrente, recibo un error del compilador de ghdl:
testest2.vhdl
entity testcase2 is
port(clk: in bit);
begin
check: assert clk'delayed'last_event >= 10 ns;
end entity testcase2;
Intentar analizar:
$ ghdl -a testcase2.vhdl
canon_extract_sensitivity: cannot handle IIR_KIND_LAST_EVENT_ATTRIBUTE (testcase2.vhdl:4:34)
******************** GHDL Bug occured ****************************
Please report this bug on http://gna.org/projects/ghdl
GHDL release: GHDL 0.33 (20150921) [Dunoon edition]
Compiled with GNAT Version: 4.8
In directory: /home/simon/vhdl/
Command line:
/usr/bin/ghdl1-llvm -P/usr/lib/ghdl/v93/std/ -P/usr/lib/ghdl/v93/ieee/ -c -o testcase2.o testcase2.vhdl
Exception TYPES.INTERNAL_ERROR raised
Exception information:
Exception name: TYPES.INTERNAL_ERROR
Message: errorout.adb:63
Call stack traceback locations:
0x4978f2 0x4f055b 0x4f0350 0x4f2513 0x4f4806 0x5597df 0x5afbba 0x46eef6 0x433013 0x7f64f836082e 0x432450 0xfffffffffffffffe
******************************************************************
ghdl: compilation error
Recibo el mismo error si muevo la aserción concurrente al cuerpo de la arquitectura, o si acorto la expresión a clk'last_event >= 10 ns
. Otras expresiones como clk'event
o clk'delayed = '1'
compilan bien, incluso si son un tanto inútiles.
Soy bastante nuevo en VHDL, pero tengo entendido que mis dos casos de prueba deberían ser equivalentes. Si no lo son, ¿por qué no? Y si lo son, ¿por qué se quejó Ghdl del segundo?