:
怎样理解initial语句只执行一次的概念?
在仿真开始时,initial语句只执行一次,但initial语句里面的语句可能不执行一次,因为如果是while循环,虽然initial语句是执行一次,但是只要进了while循环,则会执行到仿真结束。
在initial语句引导的过程中是否可以有循环语句?如果可以,是否与思考题1,互相矛盾?
可以,不矛盾。initial语句确实是只执行了一次,但并不意味着initial语句过程中就不能是循环语句,两者并不矛盾。
怎样理解由always语句引导的过程块是不断活动的?always语句的过程块是不断活动的,在仿真过程中always块始终在循环的活动着,检查always语句后面的信号是否发生相应改变,这是always活动的实质,如果always语句后面没有检查的信号则将会进入一个循环,将会使仿真器锁死。
不断活动与不断执行有什么不同?
不断活动是always语句不断活动,检查是否满足条件(如某个信号发生改变),不断执行时always语句引导的过程中的语句不断的执行着。
怎样理解沿触发和电平触发的不同?
沿触发式在某个信号在上升沿或下降沿到来时,触发执行过程块。电平触发式在某个信号发生改变时就会触发执行过程块。
是不是可以说沿触发是有间隔的,在一定的时间区间里只需要注意有限的点,而电平触发却需要注意无穷多个点?
不是。沿触发是信号的上升沿或下降沿进行触发,而电平触发式在某个信号发生改变时进行触发,并不需要注意无穷多个点。
沿触发的always快和电平触发的always块各表示什么类型的逻辑电路的行为?为什么?
沿触发的always块常表示时序逻辑电路,因为其和时序有关。电平触发的always块常表示组合逻辑电路,因为其只和电平有关。
简单叙述任务和函数的不同点
函数只能与主模块共用同一个仿真时间单元,而任务可以定义自己的仿真时间单位;
函数不能启动任务,而任务能启动其它任务和函数;
函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;
函数返回一个值,而任务则不返回值。
简单叙述$display,$write和$strobe的不同点。
$display自动地在输出后进行换行,$write则不进行自动换行,其它都非常相似,如果许多其它语句与$display任务在同一个时间单位执行,那么现些语句与$display任务的执行顺序是不确定的。如果使用$strobe,该语句总是在同时刻的其它赋值语句执行完成后执行。
简单叙述语法规定的电平敏感列表的简化写法。
关键词“or”可以用“,”代替。
如果在Verilog测试模块中,利用文件的读写产生预定格式的信号,并记录有测试价值的信号?
Verilog提供了系统任务来选择要转储的模块实例或模块实例信号($dumpvars),选择VCD文件的名称($dumpfile),选择转储过程的起点和终点($dumpon,$dumpoff),选择生成检测点($dumpall),每个任务的使用方法。例:
initial
$dumpfile ("XXXXXXXXXp"); //仿真信息转储到XXXXXXXXXp文件initial
$dumpvars;
//没有指定变量范围,把设计中全部信号都转储
initial
$dumpvars(1,top);
//转储模块实例top中的信号
//数1表示层次的等级,只转储top下第一层信号。
//即转储top模块中的变量,而不转储在top中调用
//模块中的变量
initial
$dumpvars (2,XXXXXX);//转储XXXXXX模块下两层的信号initial
$dumpvars (0,XXXXXX);//数0表示转储XXXXXX模块快下面各个层的所有信号//启动和停止转储过程
initial
begin
$dumpon;
//启动转储过程
#100000 $dumpoff;
//过了100000个仿真时间单位后,停止转储过程
end
//生成一个检查点,转储所有VCD变量的先行值
initial
$dumpall;
:
为什么在多个模块调试的情况下$monitor需要配合$moniteron和$monitoroff来工作?
$monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止,这样使得程序员可以很容易的控制$monitor何时发生。$monitoron则用于打开监控标志,启动监控任务$monitor。通常在通过调用$monitoron来启动$monitor时不管$monitor参数列表中的值是否发生改变,总是立刻输出显示当时时刻参数列表中的值,这用于在监控的初始时刻设定初始比较值。在默认情况下,控制标志在仿真的起始时刻就已经打开了。在多模式调试的情况下,许多模块中都调用了$monitor,因为任何时刻只能用一个$monitor起作用,因此需配合$monitoron与$monitoroff使用,把需要监视的模块用$monitor打开,再监视完毕后及时用$monitoroff关闭,以便把$monitor让给其他模块使用。
请用$random配合求模运算编写:
用于测试的跳变沿抖动为周期1/10的时钟波形。
随机出现的脉宽随机的窄脉宽。
module random_pulse(dout)
output [9:0] dout;
reg [9:0] dout;
integer delay;
initial
begin
#10 dout = 0;
for (k = 0; k < 100; k = k + 1)
begin
delay = {$random} % 10;
#delay dout = 1;
#delay dout = 0;
end
end
endmodule
Verilog的编译预处理与C语言的编译预处理有什么不同?
Verilog的编译处理,在编译处理命令之前以“`”开头。
C语言的编译处理,在编译处理命令之前以“#”开头。
请仔细阐释`timescale编译预处理的作用?
`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。使用`timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。
不同`timescale定义的多模块仿真测试时需要注意什么?
如果在同一个设计里,多个模块中用到的时间单位和时间精度单位不同,需要用到以下的时间结构:
用`timescale命令来声明本模块中所用到的时间单位和时间精度;
用系统任务$printtimescale来输出显示一个模块的时间单位和时间精度;
用系统任务$time和$realtime及%t格式声明来输出显示EDA工具记录的时间信息。
为什么说系统任务$readmen可以用来产生用于算法验证的极其复杂的测试也能够数据流?
在Verilog HDL程序中有两个系统任务$redmemb和$readmemh,并用来从文件中读取数据到存储器中,这两个系统任务可以在仿真的任何时刻被执行使用。复杂的数据可以用C语言产生,存在文件中,用$readmem取出存入存储器,在按节拍输出,这在验证算法逻辑电路时特别有用。
为什么熟练的使用条件编译命令可以使源代码有更大的灵活性,可以使用于不同的实现对象,如不同工艺的ASIC或速度规模不同的FPGA或CPLD,从而为软核的商品化创造条件?
合理的使用条件编译和条件执行预处理可以使测试程序适应不同的编译环境,也可以把不同的测试过程编写到一个统一的测试程序中去,可以简化测试的过程,对于复杂设计的验证模块的编写很有实用价值。