在VHDL中修改字符串的最佳方法



我目前正在为我制作的VHDL设计编写测试台架,我需要将消息写入文本文件。消息的格式为

[instance_name];[simulation_time] 

(即。U0;700 ns),文件名必须为[instance_name].log。获取实例名称和模拟时间没有问题,但是写入自定义文件名就有问题了。在模拟情况下,实例名称将以以下格式给出:

"U0ComponentXtest" 

,我想用下划线代替斜杠。有简单的方法吗?

我们的PoC库有相当大的关于字符串操作/函数的集合。PoC中有一个str_replace函数。应该解决问题的字符串。还有PoC。utils包与非字符串相关的函数,这也可能有助于处理字符串和文件I/o

一个简单的实现:

function replace(str : STRING) return STRING
  variable Result : STRING(str'range) := str;
begin
  for i in str'range loop
    if (Result(i) = '') then
      Result(i)  := '_';
    end if;
  loop;
  return Result;
end function;

用法:

constant original : STRING := "U0ComponentXtest";
constant replaced : STRING := replace(original);

简单的替换字符函数,这是更通用的,做同样的工作将是(@Paebbels的答案没有错)

      function fReplaceChar(
        a : character;
        x : character;
        s : string) return string
      is
        variable ret : string(s'range) := s;
      begin
        for i in ret'range loop
          if(ret(i) = a) then
            ret(i) := x;
          end if;
        end loop;
        return ret;
      end function fReplaceChar;

如果要替换的字符不止一个,可以将函数叠加:

  function fReplaceChar(
    a : character;
    b : character;
    x : character;
    s : string) return string
  is
  begin
    return fReplaceChar(b, x, fReplaceChar(a, x, s));
  end function fReplaceChar;

或函数调用:

 fReplaceChar(')','_',fReplaceChar(':','(','_',tb'instance_name));

例如:

 process 
 begin
     report lf & tb'instance_name & lf &
     fReplaceChar(')','_',fReplaceChar(':','(','_',tb'instance_name));
     wait;
 end process;

给:

# **注:
#:tb(sim):
# _tb_sim__

相关内容

最新更新