本文已参与「新人创作礼」活动,一起开启掘金创作之路!
- 类中可以定义wire变量吗? 不可以,因为class(类)是软件概念,里面的变量也应该是软件概念(即动态变量),不可以定义硬件变量,一个类可以有多个映射对象。 并且指向对象的句柄也可以不止一个。
关于约束求解中的solve A before B,就是要在求解B之前先去求解A。
- 下面选项中关于System Verilog中任务和函数的概念错误的是()?
A. 一般情况下,不带参数的子程序在定义或调用时并不需要带空括号()
B. 在System Verilog中,begin...end块变成可选的
C. System Verilog中可以允许函数在任意时刻调用任务
D. 在System Verilog中,参数的传递可以指定为引用而不是复制
本题答案取C,
SV允许函数调用任务,但是只能在由fork...join_none语句生成的线程中调用。
因此C是错误的。
一般而言,想要调用function,则使用function和task均可对其调用;而如果想要调用task,推荐使用task来调用
这是因为如果被调用的task内置了耗时语句,则外部调用它的方法类型必须是task
断点意味着运行到该语句的前面,该语句未被执行。
静态变量可以累积,动态变量运行离开函数后值自动清空,因此只有count1的r的值进行了+1
这一题还是需要好好消化理解的。
默认情况下,函数中的变量是静态变量,值可以累计;定义为automatic则值不会累计,但是要注意的是v2这里也进行了值的覆盖,所以第二次v2进入的时候也是变为1了,所以得到的结果都是2.
解析时刻:
one + one 最终结果还是单比特,这也就是单比特运算的结果还是单比特。,显示0
one + one +2'b0 使用了2比特常量,结果会转化为2比特
2'(one)+one 采用了类型转换,结果为2比特。显示10
- 以下关于 generate for语句,说法正确的是:
A. 循环变量使用 integer声明
B. 循环表达式的中的循环变量的值可以通过IO口传入的数据确定
C. 如果需要复制的语句只有一行,则可以省略 begin...end关键字
D. 必须是generate开始,endgenerate结束
本题答案选D,
必须使用genvar申明一个正整数变量
generate-if中的条件只能是静态变量,如 genvar,parameter 等,必须在整个程序运行期间保持不变。
需要复制的语句必须写到begin_end语句里面,即便只有一句
- 执行以下语句,d的值是:
bit [7:0] d;\
initial begin
d = {<<4{8'b0011_0101}};\
end
本题d的值是{0101_0011};
考查流操作符,包括<<和>>,用在赋值表达式的右边,后面带表达式、结构或者数组。
流操作符用于把其后的数据打包成一个比特流。
操作符>>把数据从左到右变成流,而<<则把数据从右往左变成流。
同时可以指定片段宽度,把原数据按照这个宽度分段之后再转化为流。\
- d = {<<4{8'b0011_0101}}; 表示把0011_0101分成宽度为4的两段,即0011和0101,再从右到左赋值给d,则d的值为 0101_0011,实现半字节倒序.即按照4个bit打包。
|-> 表示在同一个时钟沿 ,
|=> 表示在下一个时钟沿。
intersect 表示两个sequence同时发生,同时结束。
and 表示两个sequence同时发生,不要求同时结束。
- 对于systemverilog的动态数组,描述错误的是:
A. 在编译的时候不知道数组的大小
B. 可以是一维或者多维的
C. 压缩部分的一维的大小在定义的时候未被指定
D. 存储空间只有当数组在运行时被显式分配之后才会存在
本题的答案是C,
动态数组可以是一维或者多维的, 其中非压缩部分的一维的大小在定义的时候未被指定,其存储空间只有当数组在运行时被显式分配之后才会存在。压缩部分需要一开始就指定
关于接口的知识
- 逻辑设计已经变得如此之复杂,即便是块之间的通信也必须分割成独立的实体。System Verilog使用接口为块之间的通信建模,接口可以看作一捆智能的连线。下面选项中,关于接口说法错误的是()?
A. 接口信号必须采用非阻塞赋值来驱动
B. 使用接口时,可以在模块中定义接口
C. 可以使用modport将接口中的信号分组
D. 可以在使用接口信号的程序和模块中使用modport名
本题的答案是B,
使用接口时需要确保在模块和程序块之外声明接口变量。
因为有些编译器可能不支持在模块中定义接口。即便允许,那么接口就只是所在模块的局部变量,所以对设计的其他部分来说是不可见。
- 以下关于module和program的区别说法错误的:
A. program内部不能包含always语句块,而module可以
B. program不能调用module
C. program可以调用其他program中task或function
D. module不能调用program中的task或function
program可以调用module或其他program中task或function
使用program的好处就是
加入program目的是为了解决tb与rtl信号可能产生的竞争冒险现象
program和module区别主要有4点:
- module中可以定义program,反之不行
- module不可以调用program中的function task,反之可以
- program中不能例化其他module, interface ,program,也不能包含always块。
- 最主要区别是program是inactive时域进行的,module是active时域进行的,所以program在module之后执行,解决竞争冒险。
- 因此,我们一般推荐在Testbench中使用program,在设计dut中使用module,在顶层module中例化dut的module和 testbench的program。
program中的注意点:
- program中不能例化其他program和module
- 不能出现interface和always,可以使用initial forever替代always
- program内部可以发起多个initial块
- program中内部定义的变量最好采用阻塞赋值,当然采用非阻塞仿真器也不会产生error,驱动外部信号则应该采用非阻塞赋值
- program中的initial块和module中的initial块执行位置不同,前者在reactive,后者在active块中执行。
- program中存在的多个initial块中,如果有一个initial采用了退出系统函数$exit(),则会结束该program,而不仅仅是该initial块。