2

我是 vhdl 的新手,我正在为一个项目工作。

但最近有些事情阻止了我:

   if reset='0' then 
      prstate<="00";
      else if rising_edge(clock)  then
      case  prstate  is
          when "00"=> 
               if wd_link='1'   then
               prstate<="01";
          when "01"=> 
               (do something and) prstate<="10";
          when "10"=> 
                (do something and) prstate<="11";  
          when "11"=> 
                (do something and) prstate<="00";  
          when others=>   prstate<="00"; ----please pay attention to this line

RTL 模拟:

起初,我删除了最后一行,但是modelsim告诉我81个中只有4个case语句。我的上帝,我研究了1位包含9个值。也许最后一行是用来纠正错误的?也许当 prstate 是“0x”或“xx”时,这条线把它带到 00?好吧,也许。

通过synopsys DC综合后,有一个警告(关于案例):无法到达案例的默认分支。哈!我不知道为什么,我不在乎。

仿真后(使用相同的测试台和网表):

在我设置并释放复位输入后,modelsim 显示另一个模块给 wd_link 一个“x”,这导致了一个大错误=> prstate<="xx" and xx,and xx,end to xx...even wd_link 恢复到 0 或 1。

我猜:DC 不同意 4 值逻辑(01xz)或 9 值逻辑。所以最后一行被杀死了。但我能做什么?

请帮助我,你是我的上帝。谢谢!真挚地。

4

2 回答 2

2

如果 的值prstate始终是明确定义的("00"、或) "01",那么您可以传播任何未定义的值,如果您使用:"10""11"

when others => prstate <= (others => "XX");

如果出现错误,模拟将'X's在更多地方显示,从而更容易捕捉。

综合通常会'X's根据要求使用自由来使网表更小或更快。

于 2016-06-12T11:18:51.040 回答
1

std_logic 是一个具有 9 个值的多值逻辑系统。

case 语句(IEEE Std 1076-2008 10.9 Case 语句)要求将所有值表示为选择(第 5 段)。

除了 Morten 的回答之外,您还可以做几件事。您可以通过包 std_logic_1164 函数将 std_logic_vector 案例表达式转换为 bit_vector 变量to_bitvector(注意您尚未演示 prstate 的声明)。

architecture fum of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
        variable prstate_proxy: bit_vector (1 downto 0); -- locally static range
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            prstate_proxy := to_bitvector(prstate);
            case  prstate_proxy  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               -- when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;
end architecture;

请注意,在分析时需要知道用作 case 语句表达式的一维数组的范围(本地静态)。变量声明满足了这一点。

您还可以将其他选项的“语句序列”留空,并显示所有二进制值选项:

library ieee;
use ieee.std_logic_1164.all;

entity others_case is
    port (
        reset:  in  std_logic;
        clock:  in  std_logic
    );
end entity;

architecture foo of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            case  prstate  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;

end architecture;

请注意,当 end 语句之前没有语句时,其他选项中缺少分号(语句分隔符)。这提供了与 Morten 的答案相同的效果。

这些架构和实体声明代表了一个最小、完整和可验证的示例,虽然在模拟时没有做任何有趣的事情,但对于综合来说应该是有效的。

如果没有看到您的设计规范的其余部分,您不需要在重置 prstate 时处理案例语句中的元逻辑值。对元逻辑值的赋值对综合无效。

其他选项代表在前面的案例陈述备选方案中未具体提及的所有可能选择,或者可能代表无。

9 值 std_ulogic 表示被分为三类进行综合。映射为二进制值、元逻辑值和高阻抗值 ('Z') 的值。

'H' 和 'L' 分别映射到 '1' 和 '0' 用于合成。

元数据(“U”、“W”、“X”和“-”)不用作综合期间评估 VHDL 代码的输入。

'Z' 表示可以被附加驱动程序覆盖的值。

不可能基于逻辑门级 (RTL) 原语库中的“Z”值进行分配或驱动选择。他们可以很容易地发现其他选择代表没有选择。

IEEE Std 1076-2008, 10.9 case statement 第 9 段:

选择 others 只允许作为最后一个选择并且作为它的唯一选择;它代表在先前备选方案的选择中未给出的所有值(可能没有)。

16.8.2.4.10 高阻抗值('Z')第 4 段的解释:

每当静态高阻抗值出现在赋值语句中的值表达式以外的任何上下文中时,综合工具应将其视为等效于静态元逻辑值。

16.8.2.4.5 元数据作为案例陈述中的选择,第 1 段:

如果一个元逻辑值作为一个选择出现,或者作为一个选择的一个元素出现,在一个由综合工具解释的案例陈述中,综合工具应该将该选择解释为一个永远不会出现的选择。也就是说,所生成的解释不需要包含与存在或不存在与选择相关联的语句序列相对应的任何构造。

Synopsys 对 RTL 综合中不存在的问题发出警告(另请参阅已撤销的 IEEE Std-1076.6-2004,5. 验证方法,验证综合设计规范不依赖于输入元数据)。

于 2016-06-12T22:14:33.087 回答