0

我正在尝试为 VHDL 中的比较器进行数据流设计。它在 Xilinx 中编译和模拟很好,但我必须使用 Cadence/NCLaunch。当我将相同的代码复制到 gedit 并运行它时,它给出了一个关于分号的错误。

我的代码是:

library ieee;
use ieee.std_logic_1164.all;
-----------------------------------------------------
entity Comparator is
port(   A:    in std_logic_vector (3 downto 0);
        B:    in std_logic_vector (3 downto 0);
        AeqB:  out std_logic;
    AltB:  out std_logic;
    AgtB:  out std_logic);
end Comparator;


architecture dataflow of Comparator is

signal AeB : std_logic;
signal AlB : std_logic;
signal AgB : std_logic;
signal i : std_logic_vector (3 downto 0);
signal j : std_logic_vector (3 downto 0);

begin
    B1: BLOCK BEGIN   
        AeB <= i(3) AND i(2) AND i(1) and i(0);
        AgB <= j(3) or j(2) or j(1) or j(0);
        AlB <= AeB nor AgB;
    END BLOCK B1;


    B2: BLOCK BEGIN
            i <= a xnor b;
    END BLOCK B2;


    B3: BLOCK BEGIN
        j(3) <= (not b(3)) and a(3);
        j(2) <= i(3) and not b(2) and a(2);
        j(1) <= i(3) and i(2) and not b(1) and a(1);
        j(0) <= i(3) and i(2) and i(1) and not b(0) and a(0);       
    END BLOCK B3;


    B4: BLOCK BEGIN
        AeqB <= AeB;
        AltB <= AlB;
        AgTB <= AgB;
    END BLOCK B4;


end dataflow;

...我得到的错误是:

i <= a xnor b;
       |
ncvhdl_p: *E,EXPSMI (/ugrad/syedhuq/ECE425/Lab2/Comparator.vhd,29|11): expecting a semicolon (';') [9.5.1].

据我所知,我在那里有一个分号......如果我用四个单独的语句替换语句,比如

i(n) <= a(n) xnor b(n); //[n = 1, 2, 3, 4], 

我得到同样的错误 4 次。谁能帮我解决这个问题??

此外,它在 Synopsys (VCSMX) 中编译得很好,testbench 文件也是如此,但在链接过程中它告诉我:

Design unit 'COMPARATOR(BEHAVE)' from library '.' cannot be opened for 
  reading.
  Possible causes:
  [1] Incorrect logical to physical mapping in synopsys_sim.setup file. 
  [2] Intermediate file generation was prematurely terminated during analysis.
  Reanalyze the design unit and resolve any errors that occur during analysis.

测试台代码的相关行是:

for x1: Comparator use entity work.Comparator(Behave);
4

1 回答 1

4

我不熟悉 Cadence/NCLaunch,但知道您的代码在符合 IEEE 1076-1993 的工具中正确分析,并注意错误在哪里(您在第 29 行指出了字符位置 11,注意到它似乎是字符位置 17),我会说它要么在包 std_logic_1164 (规范和正文)中没有“xnor”未注释,要么它是符合 VHDL87 的工具,或者缺少一些工具集或命令行参数来使用正确的 std_logic_1164 包。

在 std_logic_1164 的分布式源代码中,可从 http://standards.ieee.org/downloads/1076/1076.2-1996/获得

-- --------------------------------------------------------------------
--  version | mod. date:| 
--   v4.200 | 01/02/92  | 
-- --------------------------------------------------------------------

您会发现默认情况下 xnor 被注释掉,当 VHDL92(-1993,不要问)被批准后,它应该被取消注释。

--  -----------------------------------------------------------------------
--  Note : The declaration and implementation of the "xnor" function is
--  specifically commented until at which time the VHDL language has been
--  officially adopted as containing such a function. At such a point, 
--  the following comments may be removed along with this notice without
--  further "official" ballotting of this std_logic_1164 package. It is
--  the intent of this effort to provide such a function once it becomes
--  available in the VHDL standard.
--  -----------------------------------------------------------------------
--  function "xnor" ( l, r : std_logic_vector  ) return std_logic_vector;
--  function "xnor" ( l, r : std_ulogic_vector ) return std_ulogic_vector;

9.5.1 指的是 IEEE=1076-1993 中的条件信号分配。

分析器的行为就像它不将 xnor 识别为运算符,如果您查看 -1993 7.2.1 逻辑运算符:

逻辑运算符 and、or、nand、nor、xor、xnor 和 not 是为预定义类型 BIT 和 BOOLEAN 定义的。它们还为元素类型为 BIT 或 BOOLEAN 的任何一维数组类型定义。

这告诉我们在符合 IEEE 1076-1993 的工具中,xnor 的声明将来自 std_logic_1164 包。

我快速浏览了一些 NCSIM 等在线用户指南和教程,但没有看到任何与问题相关的内容。很可能 std_logic_1164 包在声明和正文中都没有 xnor 未注释。

问题可能是天意(年龄)或您正在使用的特定工具副本,可能需要系统管理员的帮助才能更正。同时,您可以编写自己的 xnor 函数(如图所示),如果遇到任何困难,请尝试使用 not(a xor b) 代替。

architecture dataflow of Comparator is


function "xnor"  ( l : std_logic; r : std_logic ) return ux01 is
begin
    return not (l xor r);
end "xnor";

signal AeB : std_logic;
signal AlB : std_logic;
signal AgB : std_logic;
signal i : std_logic_vector (3 downto 0);
signal j : std_logic_vector (3 downto 0);

begin

另请参阅VHDL 中的奇怪 XNOR 行为

于 2013-09-07T02:48:15.810 回答