【问题标题】:"Iteration limit reached at time" when i try to simulate my code当我尝试模拟我的代码时“达到迭代限制”
【发布时间】:2023-03-22 15:08:01
【问题描述】:

我正在尝试在 VHDL 中实现 Booth 算法,已经运行了“纸质测试”并且代码显然可以工作,但是当我模拟它时,我没有得到想要的结果......然后我替换了代码做一个 A-Shift 来测试,但是当我模拟我的代码时,我得到了这个错误:

错误(可抑制):(vsim-3601) 在 180 ns 时达到迭代限制 5000。

我只是替换这一行: P := STD_LOGIC_VECTOR(unsigned(P) SRA 1);

为此: P := P(16) & P(16 downto 1);

这是atm的代码:

LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY algor_booth IS
    PORT(oper1 :  IN STD_LOGIC_VECTOR(7 DOWNTO 0);
         oper2 :  IN STD_LOGIC_VECTOR(7 DOWNTO 0);
         sel :    IN STD_LOGIC;
         result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
            );
END ENTITY;

ARCHITECTURE algor OF algor_booth IS
BEGIN
    PROCESS (sel)
        VARIABLE A, S, P: STD_LOGIC_VECTOR(16 DOWNTO 0);
        VARIABLE Ma2: STD_LOGIC_VECTOR(7 DOWNTO 0);
        --VARIABLE flag: STD_LOGIC;
    BEGIN

        IF sel = '0' THEN
            Ma2 := (NOT oper1) + 1;
            A   := oper1 & "00000000" & '0';
            S   := Ma2 & "00000000" & '0';
            P   := "00000000" & oper2 & '0';
        ELSE
            --flag := '0';
            FOR i IN 1 TO 8 LOOP
                IF P(1 DOWNTO 0) = "01" THEN
                    P := P + A;
                    --flag := '0';
                    --P(17) := flag;
                ELSIF P(1 DOWNTO 0) = "10" THEN
                    P := P + S;
                    --flag := '1';
                    --P(17) := flag;
                END IF;
                --P(17) := flag;
                P :=    P(16) & P(16 downto 1);
                --P(17) := flag;
            END LOOP;
            result <= P(16 DOWNTO 1);

        END IF;
    END PROCESS;
END algor;

【问题讨论】:

  • 找到并消除组合循环。
  • 循环有效,当我进行上述更改时,问题就开始了。
  • 在将您的代码转换为使用包 numeric_std 而不是 Synopsys 的 std_logic_unsigned 后,我对其进行了分析、阐述和模拟。将迭代限制设置为 5000 并且没有错误。请提供Minimal, Complete, and Verifiable example(包括您的测试台)。未验证您的算法。
  • 这个模块内部没有可以运行5000次迭代的循环,所以这个错误是由于与这个模块之外的代码交互而产生的。请按照 user1155120 的建议制作一个最小、完整和可验证的示例。

标签: algorithm iteration vhdl limit


【解决方案1】:

试了很多,才改了这一行:P := P(16) &amp; P(16 downto 1);

对于这个: P(16 downto 0) := P(17 downto 1);

问题解决了!

这里是固定代码:

LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY algor_booth IS
    PORT(oper1 :  IN STD_LOGIC_VECTOR(7 DOWNTO 0);
         oper2 :  IN STD_LOGIC_VECTOR(7 DOWNTO 0);
         sel :    IN STD_LOGIC;
         result : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
            );
END ENTITY;

ARCHITECTURE algor OF algor_booth IS
BEGIN
    PROCESS (oper1, oper2)
        VARIABLE A, S, P: STD_LOGIC_VECTOR(17 DOWNTO 0);
        VARIABLE Ma2: STD_LOGIC_VECTOR(7 DOWNTO 0);
        VARIABLE flag: STD_LOGIC;
    BEGIN
            Ma2 := (NOT oper1) + 1;
            A   := '0' & oper1 & "00000000" & '0';
            S   := '0' & Ma2 & "00000000" & '0';
            P   := '0' & "00000000" & oper2 & '0';  
            flag := '0';

            FOR i IN 1 TO 8 LOOP
                IF (P(1) = '0' AND P(0) = '1') THEN
                    flag := '0';
                    P(17) := flag;
                          P := P + A;
                ELSIF (P(1) = '1' AND P(0) = '0') THEN
                    flag := '1';
                    P(17) := flag;
                          P := P + S;
                END IF;
                P(17) := flag;
                P(16 downto 0) := P(17 downto 1);
                P(17) := flag;
            END LOOP;
            result <= P(16 DOWNTO 1);
    END PROCESS;
END algor;

感谢你们的帮助!

【讨论】:

  • 查看您的代码的两个版本,这里没有任何解释问题或修复的地方。查看 Modelsim 用户手册,我们发现这是一个零时间循环,这意味着您看不见的测试平台和您的设计模型之间的交互,您已经对其进行了调整以消除问题。如果没有展示问题和解决方案的最小、完整和可验证的示例,问题和答案对其他 Stackoverflow 读者没有用处。
猜你喜欢
  • 2011-08-09
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2021-07-04
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多