Hi Andre,
There are two separate attributes; one for input registers and one for output registers.
Use "fast_input_register = on" to put a register that is capturing an input to the FPGA from an I/O cell into the I/O cell. Use "fast_output_register = on" to put a register that is storing a value that drives an I/O cell (either the data port or the OE port) into the I/O cell.
You can set these attributes either on registers or on I/O cells. So if you have a bidirectional I/O, and want both the input path and output path registers for the signals into and out of the I/O cell to be implemented in the I/O cell, set the altera_attribute on the I/O to be: "-name fast_input_register = on; -name fast_output_register = on"
Alternatively, you can just set timing constraints on your I/O paths in Quartus, and it will move registers into the I/O cells if that will improve your timing. In that case, you don't need to make any fast register assignments. You should really make I/O timing assignments no matter what, since (1) you want to know if you violate a constraint on your design, and (2) there are other I/O timing optimization decisions Quartus makes besides just where to put the registers connected to an I/O, and those optimizations need timing constraints to guide them.
Regards,
Vaughn Altera [v b e t z (at) altera.com]
I think the use of attributes in VHDL modules can be helpful for the purpose of clearness and readability.
Regarding tristate buffers I have the following additional question:
Let's assume the following description of a bidirectional bus with tristate buffer:
ENTITY xy IS PORT ( ... DataInOut : INOUT std_logic_vector(15 downto 0); ... END xy;
ARCHITECTURE gt OF xy IS BEGIN DataInOut 'Z'); -- with ls_datareg and ls_drive being registers.
END gt;
What does the Altera fitter do if I use the useioff attribute for the bidirectional DataInOut ? Does the fitter implement fast input registers as well as fast output registers ?
Best regards André