Quartus II支持line.all吗?

时间:2014-11-20 21:40:59

标签: vhdl xilinx intel-fpga quartus

我在编译时实现了一些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)错误消息:

  • 错误(10351):sata_PhysicalLayer.vhdl上的VHDL子程序正文错误(504):函数“dbg_GenerateEncodings”并不总是返回值
  • 错误(10346):debug.vhdl(47)处的VHDL错误:正式端口或参数“编码”必须具有实际值或默认值
  • 错误(10657):sata_PhysicalLayer.vhdl上的VHDL子程序错误(514):未能详细调用子程序“dbg_ExportEncoding”

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


VHDL代码

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

  1. 将当前本地FSM状态编码为二进制值 - > dbg_EncodeState
    (此功能的结果连接到ILA端口)
  2. 将本地FSM的所有状态转换为以分号分隔的字符串 - > dbg_GenerateEncodings
  3. 格式化此字符串并将其元素写入令牌文件 - > dbg_ExportEncoding
    (此功能位于包中)
  4. FSM声明:

    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;
    

    本地功能 - 每个实体功能

    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;
    

    全局函数 - 在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");
    

    使用了辅助功能:

    • log2ceilnz(x)计算以二进制
    • 编码x符号所需的位
    • to_slv将所有内容转换为std_logic_vector;在这种情况下,整数到slv
    • str_replace用字符串
    • 替换字符串
    • str_trim返回从str'low到第一次出现的NUL
    • 的字符串
    • raw_format_nat_hex将自然格式化为十六进制字符串

    附加说明:
    所有vhdl文件都标记为VHDL-2008。


    我的问题:

    1. 有没有人在Quartus环境中使用line.all?
    2. 有解决方法吗?
    3. 是否有更好的解决方案来实现导出任务而不使用常量长度的字符串?

    4. 解决方法:

      我将函数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 个答案:

答案 0 :(得分:1)

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

  

支持的。文件I / O无法合成;因此,致电TEXTIO   函数被忽略。

如果您无法使用TEXTIO进行合成,您可以想象一个指向行缓冲区的指针也可能没有任何用处。

这就是你如何从FPGA写入文件的问题。不了解主机操作系统或指定物理接口。

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