如何将let与typedef信号一起使用



我正在尝试在TB中使用let构造,而不是`define来通过分层路径访问一些信号。进展不太顺利"正常";信号似乎有效,我可以访问它们,但typedef信号的行为很奇怪。

下面是一个超级简单的示例代码,我用它来触发错误:

module dut();
// Create a type
typedef struct {
int foo;
int bar;
} ty_fooBar;
// Instantiate the type
ty_fooBar fooBar;
// Create an "alias" for fooBar
let fooBar2 = fooBar;
// Assign some values and try to access the struct members
initial begin
fooBar.foo = 3;
fooBar.bar = 7;
$display("fooBar: %p",  fooBar  );
$display("fooBar2: %p", fooBar2 );
$display("fooBar.fooBar: %p",  fooBar.foo  );
// $display("fooBar2.fooBar: %p", fooBar2.foo );    <- ERROR
end
endmodule

仿真结果如下:

# fooBar: '{foo:3, bar:7}
# fooBar2: '{foo:3, bar:7}
# fooBar.fooBar: 3

因此,fooBar现在应该与fooBar2相同,ModelSim用$display命令显示了这一点,但由于某种原因,我可以访问ooBar.foo,但不能访问fooBar2.foo。我试着阅读IEEE标准,但这对我没有启发。

lettypedef有什么问题?我有什么深刻的误解吗?

let语句将`define宏的灵活性与良好的函数结构相结合。

就像一个宏。CCD_ 3自变量被替换到其定义的主体中。它们可能是无类型的。

function一样,let声明是作用域的本地声明,包括可以导入的包。对不是参数的标识符的引用是从声明的点开始搜索的。最后,您面临的问题是,let语句只能在允许表达式的情况下调用。事实上,它在替换之前将括号放在正文周围。

因此,您对fooBar2.foo的引用被扩展为(fooBar).foo,这是不合法的。

最新更新