| |
Connect/SystemVerilogTechniques
Introduction and Recommendations
SystemVerilog通常提供四种不同的通信方式或实例之间的连接:ports,指针,Verilog分层路径和共享变量。对于基于testbench的类来说,可能不使用ports。不建议使用分层路径。指针是常用的手段。共享变量可以在特定的区域中使用。
Ports
Ports是诸如模块和接口实例这样的静态实例领域的成员之间的连接。因此,它们不能用于属于动态实例领域的类中。
UVM提供ports的概念,例如uvm_tlm_put_port等。这些不是SystemVerilog ports,而是围绕指针的包装类。因此,UVM TLM port是一种基于指针的通信方案,类似于Verilog和VHDL工程师熟悉的ports。
Handles
类句柄指向类对象(实例)。它被称为句柄以区分指针。句柄被认为是安全指针,因为与其他语言(如C)中的指针相比,它使用了限制性规则。
虚拟接口是代表接口实例的变量。它可以被认为是接口实例的句柄。
Verilog Hierarchical Path
SystemVerilog中的每个标识符都具有唯一的分层路径名。任何其他SystemVerilog object都可以通过此分层路径名引用任何已命名的SystemVerilog object。
虽然这是强大的,因为它允许从任何地方到任何地方的通信,但通常不希望使用这种技术。在建模中,它是绝对的“禁忌”,因为连接隐含在分层引用中。在建模时,这种隐式连接不会被综合或者被创建。在验证中应该避免使用,因为在使用时可移植性和可重用性就被限制了。
Shared Variables
共享变量有时被称为全局变量,尽管一般来说它们并不是真正的全局变量。共享变量是在作用域中声明的变量,可以由其他作用域引用。在共享变量行为中,可以在这些其他作用域中读取和/或写入变量。测试平台中使用的两个最常见的共享变量示例是在package中声明的变量和class的静态属性声明。
在packages中,可以声明变量,例如int或虚拟接口。这些变量可以通过完全解析的名称(package_name :: variable_name)或通过一个import在其他作用域(例如类或模块)中被引用(即读取和写入)。类的静态属性声明可以由完全解析的名称引用(class_name :: static_property_name)。通常可以提供类的静态method来访问静态property。
建议共享变量仅用于初始化或status type通信,其中在写入和读取信息之间存在明确的关系。
不建议将共享变量用于对象之间的数据传输,例如transactions。
由于共享变量的性质,竞争条件是固有的,因此必须小心或将发生竞争。【这种类似全局变量的东西还是尽量少用,以免和自己的私有变量发生应用冲突】