Home Articles

Quartus II支持line.all吗?

Asked
Viewed 490 times
1

我在编译时实现了一些VHDL代码来导出FSM状态编码,可以通过Xilinx ChipScope读回 . 此功能通过Xilinx ISE 14.7,iSim 14.7和Mentor Graphic的QuestaSim 10.2c进行测试 . 我的设计可以与Altera FPGA的替代顶级电路合成,但Quartus II似乎与 return line.all; 有问题 .

Quartus II (14.0) error messages:

  • 错误(10351):sata_PhysicalLayer.vhdl上的VHDL子程序正文错误(504):函数"dbg_GenerateEncodings"并不总是返回值

  • 错误(10346):debug.vhdl(47)处的VHDL错误:正式端口或参数"encodings"必须具有实际值或默认值

  • 错误(10657):sata_PhysicalLayer.vhdl上的VHDL子程序错误(514):未能详细调用子程序"dbg_ExportEncoding"

在下文中,我将描述我的代码 .


VHDL代码

该设计使用3个函数导出FSM状态编码:

  • 将当前本地FSM状态编码为二进制值 - > dbg_EncodeState
    (此功能的结果连接到ILA端口)

  • 将本地FSM的所有状态转换为分号分隔的字符串 - > dbg_GenerateEncodings

  • 格式化此字符串并将其元素写入令牌文件 - > dbg_ExportEncoding
    (此功能位于包中)

FSM declaration:

TYPE T_STATE IS (
    ST_HOST_RESET,
    ST_HOST_SEND_COMRESET,
    ST_HOST_SEND_COMRESET_WAIT,
    [...]
    ST_HOST_SEND_ALIGN,
    ST_HOST_TIMEOUT,
    ST_HOST_LINK_OK
);

-- OOB-Statemachine
SIGNAL State                    : T_STATE       := ST_HOST_RESET;
SIGNAL NextState                : T_STATE;

local functions - per entity functions

function dbg_EncodeState(st : T_STATE) return STD_LOGIC_VECTOR is
begin
    return to_slv(T_STATE'pos(st), log2ceilnz(T_STATE'pos(T_STATE'high) + 1));
end function;

function dbg_GenerateEncodings return string is
  variable l : STD.TextIO.line;
begin
    for i in T_STATE loop
        STD.TextIO.write(l, str_replace(T_STATE'image(i), "st_host_", ""));
        STD.TextIO.write(l, ';');
    end loop;
    return  l.all;
end function;

global function - defined in debug.pkg.vhdl:

impure function dbg_ExportEncoding(Name : STRING; encodings : string; tokenFileName : STRING) return BOOLEAN is
    file        tokenFile : TEXT open WRITE_MODE is tokenFileName;

    variable cnt, base : integer;
    variable l : line;
begin
    report "Exporting encoding of '" & Name & "' to '" & tokenFileName & "'..." severity note;
    report "dbg_ExportEncoding: '" & encodings & "'" severity note;

    -- write file header
    write(l, "# Encoding file for '" & Name & "'"); writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# ChipScope Token File Version");     writeline(tokenFile, l);
    write(l, "@FILE_VERSION=1.0.0");                writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);
    write(l, "# Default token value");              writeline(tokenFile, l);
    write(l, "@DEFAULT_TOKEN=");                    writeline(tokenFile, l);
    write(l, "#");                                  writeline(tokenFile, l);

    -- write state entires
    cnt  := 0;
    base := encodings'left;
    for i in encodings'range loop
        if encodings(i) = ';' then
            -- Leave the str_trim call in!
            -- Otherwise, the new parser of ISE 14.7 fails to slice properly.
            write(l, str_trim(encodings(base to i-1)));
            write(l, character'('='));
          write(l, raw_format_nat_hex(cnt));
            writeline(tokenFile, l);
            cnt  := cnt + 1;
            base := i+1;
        end if;
    end loop;

    file_close(tokenFile);
    return true;
end function;

代码的最后一部分是实体中的虚拟常量,它调用导出函数:

CONSTANT test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");

used auxilary functions:

  • log2ceilnz(x)计算以二进制编码x符号所需的位

  • to_slv将所有内容转换为std_logic_vector;在这种情况下,整数到slv

  • str_replace用字符串替换字符串

  • str_trim返回从str'low到第一次出现NUL的字符串

  • raw_format_nat_hex将自然格式化为十六进制字符串

Additional Notes:
所有vhdl文件都标记为VHDL-2008 .


我的问题:

  • 有没有人在Quartus环境中使用line.all?

  • 有解决方法吗?

  • 有没有更好的解决方案来实现导出任务而不使用常量长度的字符串?


解决方法:

我将函数dbg_GenerateEncodings包装在generate语句中:

genXilinx : if (VENDOR = VENDOR_XILINX) generate
  function dbg_GenerateEncodings return string is
  [...]

  constant test : boolean := dbg_ExportEncoding("OOBControl (Host)", dbg_GenerateEncodings, MY_PROJECT_DIR & "CSP/FSM_OOB_Host.tok");
begin
end generate;

与XST相比,Quartus不检查生成块内的函数 .

1 Answer

  • 1

    参见Quartus II VHDL Support,第14节预定义语言环境,表项14.3,构造TEXTIO,最右边的列VHDL 1993支持:

    支持 . 文件I / O无法合成;因此,忽略对TEXTIO函数的调用 .

    如果你不能使用TEXTIO进行综合,你可以想象一个指向行缓冲区的指针可能也没有任何用处 .

    这是关于如何从FPGA写入FILE的问题 . 不了解主机操作系统或指定物理接口 .

    您可以通过使用translate off和translate指令来包含不受支持的结构来设法合成设计的其余部分 . 见VHDL Synthesis Attributes and Directives .

Related