本文源自微信公众号 :数字晶元实验室
1、连续赋值和过程赋值之间有什么区别?
2、initial和always中的赋值有什么区别?initial和always中的赋值都是过程赋值。
3、阻塞和非阻塞赋值之间有什么区别?阻塞和非阻塞赋值都是过程赋值。
4、如何使用连续赋值建模双向nets?
assign语句构成一个连续赋值。 RHS变化立即影响LHS。 然而,LHS的任何变化都不会影响RHS。
System Verilog引入了一个关键字alias,能定义双向nets。
如果上述alias换成assign,则输出如下:
5、task和function之间有什么区别?
Verilog中的task和function都可以实现常用功能,有助于代码的清晰和可维护,避免在不同位置复制大量代码。 本质上,task和function都提供了在模块中不同位置重用相同代码段的「子程序」机制。
6、静态task和动态task有何不同?
动态task在关键字task和名称之间有automatic关键字。 动态task在每个task调用期间,自动分配变数内存空间,即每次调用都不会覆盖这些值。没有automatic关键字,变数是静态分配的,这意味著这些变数在不同的task调用之间共享,因此可以被覆盖。
在上面的示例中,my_value是task中的局部变数。 每当调用此task时,输入in_value在5个模拟时间单位之后赋值给局部变数。 在initial begin中,有一个fork-join,它启动两个并行进程,分别在模拟时间单位#1和#2之后开始。 第1个进程赋值2给my_value,第2个进程赋值3给my_value。 假设没有automatic关键字,使用上面的代码运行模拟,会输出以下内容:
没有automatic关键字的事件序列如下:
1. 从模拟时间0开始启动fork-join两个进程。
按照上述相同的步骤,这次,由于存在关键字automatic,变数不会被其他进程覆盖。
7、如何覆盖automatic task中的变数?
默认情况下,module中的所有变数都是静态的。 但是, task/function中的变数都可以定义为static或automatic。
System Verilog引入了关键字static。 当task/function被明确定义为static,它的变数只分配一次内存,并且多次调用将覆盖其变数。 、
8、如何没有返回值地调用function?在Verilog 2001之前,任何function调用都必须返回一个值,调用function的代码必须接收返回值。 例如,以下是语法错误:
上面例子中的一行是语法错误,因为调用了my_funct,却没有返回值。 只有task可以在没有返回值的情况下调用。
上面的例子显示了结果:
3、function返回值默认为1比特位宽
9、如何在例化时修改模块的parameter值?
使用上述方法的限制是:
请注意,显式地按parameter名称指定修改方式,括弧中的值是修改的值。 在在U2实例化中,只需指定depth即可,无需为width指定任何修改值。
以下总结了使用defparam方法的优点:
10、如果阻止模块例化时parameters不被改变
如果需要阻止模块中的特定parameters被改变,应该使用localparam,而不是parameter。 localparam在Verilog-2001中引入。在以下示例中,localparam用于声明num_bits,因此尝试改变它会给出Error。
请注意,由于width和depth是使用parameter指定的,它们可以在实例化时被改变。
11、使用`define和parameter有什么区别?
12、什么是派生parameters?
使用派生parameters可以增强RTL代码的可重用性。
13、层次化设计当中连接Ports的方法有哪些?各自的优缺点是什么?1)按顺序连接
2)按名称连接
按名称连接提高了port连接的可读性, 和port声明的顺序不再相关,因为它们是显示连接的。
3)按Interface连接
喜欢请别放弃