regerror_flag;//全局变量
functioncompare(...);//全局函数
always@(error_flag)//全局语句
...
moduletest;
chip1 u1(...)
endmodule
modulechip1(...);
FSM u2(...);
always@(data)
error_flag= compare(data, expected);
endmodule
moduleFSM(...);
...
always@(state)
error_flag= compare(state, expected);
endmodule
3. 时间单位和精度
在Verilog中,表示时间的值使用一个数来表示,而不带有任何时间单位。例如:
从这一句中我们无法判断5代表的是5ns? 5ps? 还是其他。Verilog的时间单位和精度是作为每一个模块的属性,并使用编译器指令`timescale来设置。使用这种方法具有固有的缺陷,因为编译器指令的执行依赖于源代码的编译顺序,编译器总是将它遇到的最后一个`timescale设置的时间单位和精度作为之后的标准。那么,假如有些模块之前没有使用`timescale设置时间单位和精度,这就有可能出现同一个源代码的不同仿真会出现不同结果的情况。
SystemVerilog为了控制时间单位加入了两个重要的增强。首先,时间值可以显式地指定一个单位。时间单位可以是s、ms、ns、ps或fs。时间单位作为时间值的后缀出现。例如:
其次,SystemVerilog允许使用新的关键字(timeunits和timeprecision)来指定时间单位和精度。这些声明可以在任何模块中指定,同时也可以在$root空间中全局指定。时间单位和精度必须是10的幂,范围可以从s到fs。例如:
4. 抽象数据类型
Verilog提供了面向底层硬件的线网、寄存器和变量数据类型。这些类型代表了4态逻辑值,通常用来在底层上对硬件进行建模和验证。线网数据类型还具有多个强度级别,并且能够为多驱动源的线网提供解析功能。
SystemVerilog包括了C语言的char和int数据类型,它允许在Verilog模型和验证程序中直接使用C和C++代码。VerilogPLI不再需要集成总线功能模型、算法模型和C函数。SystemVerilog还为Verilog加入了几个新的数据类型,以便能够在更抽象的层次上建模硬件。
lchar:一个两态的有符号变量,它与C语言中的char数据类型相同,可以是一个8位整数(ASCII)或short int(Unicode);
lint:一个两态的有符号变量,它与C语言中的int数据类型相似,但被精确地定义成32位;
lshortint:一个两态的有符号变量,被精确地定义成16位;
llongint:一个两态的有符号变量,它与C语言中的long数据类型相似,但被精确地定义成64位;
lbyte:一个两态的有符号变量,被精确地定义成8位;
lbit:一个两态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的reg数据类型;
llogic:一个四态的可以具有任意向量宽度的无符号数据类型,可以用来替代Verilog的线网或reg数据类型,但具有某些限制;
lshortreal:一个两态的单精度浮点变量,与C语言的float类型相同;
lvoid:表示没有值,可以定义成一个函数的返回值,与C语言中的含义相同。
SystemVerilog的bit和其他数据类型允许用户使用两态逻辑对设计建模,这种方法对仿真性能更有效率。由于Verilog语言没有两态数据类型,因此许多都通过将这种功能作为的一个选项提供。这些选项不能够在所有的之间移植,而且在需要时用三态或四态逻辑的设计中强制使用两态逻辑还具有副作用。SystemVerilog的bit数据类型能够极大改进的性能,同时在需要的时候仍然可以使用三态或四态逻辑。通过使用具有确定行为的数据类型来代替专有的选项,两态模型能够在所有的SystemVerilog间移植。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87180-2.html
quot