我是编码测试台的新手,因此我需要学习很多新语法.我坚持试图理解"字符串"后的撇号是什么.
它似乎不是来自这里的属性.另外,我在VHDL中的撇号之后从未见过括号.
procedure Shrink_line(L : inout LINE; pos : in integer)
is
variable old_L : LINE := L;
begin
if pos > 1 then
L := new string'(old_L(pos to old_L'high));
Deallocate(old_L);
end if;
end;
Run Code Online (Sandbox Code Playgroud)
这是一个合格的表达方式.
IEEE Std 1076-2008,9.3.5合格表达式:
限定表达式是一种基本操作(见5.1),用于显式声明作为表达式或聚合的操作数的类型,可能还有子类型."
qualified_expression :: =
type_mark'(表达式)
| type_mark'聚合
此限定表达式指出过程中分配给L的分配器(9.3.7分配器)的类型和子类型.
限定表达式的操作数是表达式old_L(pos to old_L'high).
它不是聚合,它不使用命名关联来区分具有单个选项的括号表达式(9.3.3聚合).
因为您没有使用覆盖表达式的引用,所以您可能不知道此分配器可以执行的操作.创建MCVE:
use std.textio.all;
entity foo is
end entity;
architecture fum of foo is
procedure Shrink_line(L : inout LINE; pos : in integer)
is
variable old_L : LINE := L;
begin
if pos > 1 then
L := new string'(old_L(pos to old_L'high));
Deallocate(old_L);
end if;
end;
begin
process
variable L: LINE;
begin
write (L, string'("...shrinking violet"));
Shrink_line(L, 14);
writeline(OUTPUT,L);
wait;
end process;
end architecture;
Run Code Online (Sandbox Code Playgroud)
在模拟中运行此代码可提供输出:
ghdl -a foo.vhdl
ghdl -e foo
ghdl -r foo
violet
输出来自写入到OUTPUT(这是文件STD_OUTPUT(POSIX用语中的标准输出)).
9.3.7分配员,第2段:
分配器创建的对象类型是子类型指示或限定表达式中给出的类型标记的基本类型.对于具有子类型指示的分配器,创建的对象的初始值与指定子类型的显式声明的变量的默认初始值相同.对于具有限定表达式的分配器,此表达式定义创建的对象的初始值.
从旧分配器创建具有子类型约束的新分配器,从位置pos开始复制来自旧分配器的字符串.
另外需要注意的是,默认情况下,左边界的字符串是1.Shrink_line依此计算.