2
\$\begingroup\$

I'm getting the error "[Synth 8-2519] partially associated formal q8 cannot have actual OPEN" - this error is for the line Q8(0) => OPEN, and all similar OPEN assignments. I'm using these because the IN_FIFO element is too large for the data I want to send through it.

The full entity instantiation is below for context (sorry about the large code below, it's just a large set of assignments).

IN_FIFO_LVDS_A_inst : IN_FIFO
generic map (
  ALMOST_EMPTY_VALUE  => 1,                   -- Almost empty offset (1-2)
  ALMOST_FULL_VALUE   => 1,                   -- Almost full offset (1-2)
  ARRAY_MODE          => "ARRAY_MODE_4_X_4",  -- ARRAY_MODE_4_X_8, ARRAY_MODE_4_X_4
  SYNCHRONOUS_MODE    => "FALSE"              -- Clocks synchronous to each other (FALSE)
)
port map (
-- FIFO Status Flags: 1-bit (each) output: Flags and other FIFO status outputs
ALMOSTEMPTY => ALMOSTEMPTY_LVDS_S,      -- 1-bit output: Almost empty
ALMOSTFULL  => ALMOSTFULL_LVDS_S,       -- 1-bit output: Almost full
EMPTY       => EMPTY_LVDS_S,            -- 1-bit output: Empty
FULL        => FULL_LVDS_S,             -- 1-bit output: Full
-- Q0-Q9: 8-bit (each) output: FIFO Outputs
Q0(0) => a_line_lvds_i_1_sync_s(13) , -- output: Channel 0
Q0(1) => a_line_lvds_i_1_sync_s(12) ,
Q0(2) => a_line_lvds_i_1_sync_s(11) ,
Q0(3) => a_line_lvds_i_1_sync_s(10) ,

Q1(0) => a_line_lvds_i_1_sync_s(9)  , -- output: Channel 1
Q1(1) => a_line_lvds_i_1_sync_s(8)  ,
Q1(2) => a_line_lvds_i_1_sync_s(7)  ,
Q1(3) => a_line_lvds_i_1_sync_s(6)  ,

Q2(0) => a_line_lvds_i_1_sync_s(5)  , -- output: Channel 2
Q2(1) => a_line_lvds_i_1_sync_s(4)  ,
Q2(2) => a_line_lvds_i_1_sync_s(3)  ,
Q2(3) => a_line_lvds_i_1_sync_s(2)  ,

Q3(0) => a_line_lvds_i_1_sync_s(1)  , -- output: Channel 3
Q3(1) => a_line_lvds_i_1_sync_s(0)  ,
Q3(2) => a_line_lvds_i_0_sync_s(17) ,
Q3(3) => a_line_lvds_i_0_sync_s(16) ,

Q4(0) => a_line_lvds_i_0_sync_s(15) , -- output: Channel 4
Q4(1) => a_line_lvds_i_0_sync_s(14) ,
Q4(2) => a_line_lvds_i_0_sync_s(13) ,
Q4(3) => a_line_lvds_i_0_sync_s(12) ,

Q5(0) => a_line_lvds_i_0_sync_s(11) , -- output: Channel 5
Q5(1) => a_line_lvds_i_0_sync_s(10) ,
Q5(2) => a_line_lvds_i_0_sync_s(9)  ,
Q5(3) => a_line_lvds_i_0_sync_s(8)  ,

Q6(0) => a_line_lvds_i_0_sync_s(7)  , -- output: Channel 6
Q6(1) => a_line_lvds_i_0_sync_s(6)  ,
Q6(2) => a_line_lvds_i_0_sync_s(5)  ,
Q6(3) => a_line_lvds_i_0_sync_s(4)  ,

Q7(0) => a_line_lvds_i_0_sync_s(3)  , -- output: Channel 7
Q7(1) => a_line_lvds_i_0_sync_s(2)  ,
Q7(2) => a_line_lvds_i_0_sync_s(1)  ,
Q7(3) => a_line_lvds_i_0_sync_s(0)  ,

Q8(0) => OPEN                       , -- output: Channel 8
Q8(1) => OPEN                       ,
Q8(2) => OPEN                       ,
Q8(3) => OPEN                       ,

Q9(0) => OPEN                       , -- output: Channel 9
Q9(1) => OPEN                       ,
Q9(2) => OPEN                       ,
Q9(3) => OPEN                       ,

-- D0-D9: 4-bit (each) input: FIFO inputs
D0(0) => a_line_lvds_i_1_s(13)      ,  -- input: Channel 0
D0(1) => a_line_lvds_i_1_s(12)      ,     
D0(2) => a_line_lvds_i_1_s(11)      ,     
D0(3) => a_line_lvds_i_1_s(10)      ,     

D1(0) => a_line_lvds_i_1_s(9)       ,  -- input: Channel 1
D1(1) => a_line_lvds_i_1_s(8)       ,     
D1(2) => a_line_lvds_i_1_s(7)       ,     
D1(3) => a_line_lvds_i_1_s(6)       ,     

D2(0) => a_line_lvds_i_1_s(5)       ,  -- input: Channel 2
D2(1) => a_line_lvds_i_1_s(4)       ,     
D2(2) => a_line_lvds_i_1_s(3)       ,     
D2(3) => a_line_lvds_i_1_s(2)       ,     

D3(0) => a_line_lvds_i_1_s(1)       ,  -- input: Channel 3
D3(1) => a_line_lvds_i_1_s(0)       ,     
D3(2) => a_line_lvds_i_0_s(17)      ,     
D3(3) => a_line_lvds_i_0_s(16)      ,     

D4(0) => a_line_lvds_i_0_s(15)      ,  -- input: Channel 4
D4(1) => a_line_lvds_i_0_s(14)      ,     
D4(2) => a_line_lvds_i_0_s(13)      ,     
D4(3) => a_line_lvds_i_0_s(12)      ,     

D5(0) => a_line_lvds_i_0_s(11)      ,  -- input: Channel 5
D5(1) => a_line_lvds_i_0_s(10)      ,     
D5(2) => a_line_lvds_i_0_s(9)       ,     
D5(3) => a_line_lvds_i_0_s(8)       ,     
D5(4) => '0'                        ,     
D5(5) => '0'                        ,     
D5(6) => '0'                        ,     
D5(7) => '0'                        ,     

D6(0) => a_line_lvds_i_0_s(7)       ,  -- input: Channel 6
D6(1) => a_line_lvds_i_0_s(6)       ,     
D6(2) => a_line_lvds_i_0_s(5)       ,     
D6(3) => a_line_lvds_i_0_s(4)       ,     
D6(4) => '0'                        ,     
D6(5) => '0'                        ,     
D6(6) => '0'                        ,     
D6(7) => '0'                        ,     

D7(0) => a_line_lvds_i_0_s(3)       ,  -- input: Channel 7
D7(1) => a_line_lvds_i_0_s(2)       ,     
D7(2) => a_line_lvds_i_0_s(1)       ,     
D7(3) => a_line_lvds_i_0_s(0)       ,     

D8(0) => '0'                        ,  -- input: Channel 8
D8(1) => '0'                        ,     
D8(2) => '0'                        ,     
D8(3) => '0'                        ,     

D9(0) => '0'                        ,  -- input: Channel 9
D9(1) => '0'                        ,
D9(2) => '0'                        ,
D9(3) => '0'                        ,

-- FIFO Control Signals: 1-bit (each) input: Clocks, Resets and Enables
RDCLK => clk_150MHz_thruline_s      , -- 1-bit input: Read clock
RDEN  => '1'                        , -- 1-bit input: Read enable
RESET => bus_a_reset_pl(1)          , -- 1-bit input: Reset
WRCLK => dclk_a_pll_clk0            , -- 1-bit input: Write clock
WREN  => '1'                          -- 1-bit input: Write enable
);

I'm confused as to why the synthesiser in Vivado complains about this - surely I can set unused outputs to OPEN and unused inputs to '0'. Is there something special about the IN_FIFO?

\$\endgroup\$
  • \$\begingroup\$ Only had a quick glance but have you tried connecting your unused I/O to signals, leaving the unused output signals unconnected and tying the unused input signals to zeroes? \$\endgroup\$ – TonyM Jan 22 '18 at 11:31
  • 1
    \$\begingroup\$ Weirdly, setting the whole of Q8 => OPEN, instead of Q8(0) => OPEN, Q8(1) => OPEN,... etc seems to have got rid of the warning message. Apparently Vivado synthesis hates setting individual lines to open despite the fact that the code logically does the same thing?! \$\endgroup\$ – BenAdamson Jan 22 '18 at 11:54
  • \$\begingroup\$ Saw that, thanks, upvoted @scary_jeff 's good answer and filed it away - am using Vivado on a forthcoming project. \$\endgroup\$ – TonyM Jan 22 '18 at 12:04
6
\$\begingroup\$

In VHDL, you cannot connect an individual element of a port to open. You must connect either the whole port to open, or connect some elements to your intended signals, and others to 'dummy' unused signals.

So you have a couple of options:

Q8 => open, -- Just associate the whole port with `open`

if for some reason you must use individual association:

signal unused_q8 : std_logic_vector(3 downto 0);

Q8(0) => unused_q8(0),
Q8(1) => unused_q8(1),
Q8(2) => unused_q8(2),
Q8(3) => unused_q8(3),

The more common scenario in which you would see this error message would look like:

Q8(2 downto 0) => q8_out(2 downto 0),
Q8(3) => open,

Here we have associated some elements of an output vector with a signal, and others with open. This is not supported.

\$\endgroup\$
  • \$\begingroup\$ Thanks - I managed to stumble upon this for myself a second ago. It's pretty weird that Vivado doesn't permit this use of OPEN. Good explanation! \$\endgroup\$ – BenAdamson Jan 22 '18 at 11:56
  • \$\begingroup\$ All synth tools have some quirks. With a relatively harmless one like this, just use either of the clean workarounds and move on. \$\endgroup\$ – Brian Drummond Jan 22 '18 at 12:37
  • \$\begingroup\$ IEEE Std 1076-2008 6.5.7 Association lists, 6.5.7.1 paragraph 18 - It is an error if an actual of open is associated with a formal interface object that is associated individually. An actual of open counts as the single association allowed for the corresponding formal interface object, but does not supply a constant, signal, or variable (as is appropriate to the object class of the formal) to the formal. Not just Vivado, it allows the use of a default expression for the formal. \$\endgroup\$ – user8352 Jan 22 '18 at 16:07
  • 1
    \$\begingroup\$ @BrianDrummond All synth tools have some quirks. Yes, but this rule originates in the VHDL LRM. We'll remove it in the next LRM release :). \$\endgroup\$ – Paebbels Jan 22 '18 at 17:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.