在HDLBits学习中,了解到隐式网、压缩和解压缩的概念,下面对它进行详细的讨论:
一、Implicit Nets
在Verilog当中,如果在一个assign语句或者一个未被声明的模块当中出现/引用未声明的向量,Implicit nets 就会被隐性地生成在模块当中。Implicit nets一般都是一位wire变量,如果作为向量使用,很可能会报错。
用指令default_nettype none可以禁止Implicit nets 的生成。
wire [2:0] a,c; //a和c是3位长的向量
assign a = 3'b101; // a == 101
assign b = a; // b == 1
assign c = b; // c == 001
my_module i1 (d,e); // d和e没有声明直接被my_module拿去用了
//这时候它们就成了implicit net,是一位宽的wire变量
针对未声明标识符在具体设计中出现的具体位置,进行以下几个方面仿真验证:
1.在过程性赋值语句中,未声明的标识符出现在表达式左侧或右侧:
reg proce_var;
initial begin
proce_var = net_var;
end
编译结果:
2.在连续赋值语句中,未声明标识符出现在表达式右侧
wire cont_var;
assign cont_var = net_var;
编译结果:
3.连续赋值语句中,未声明标识符出现在表达式左侧
wire cont_var;
assign net_var = cont_var;
编译过程未给出任何违例信息,但会导致逻辑功能的异常
二、Pack和Unpack
在声明中,向量的指针写在向量名字的前面。这声明了数组的“压缩”维度,这些位宽被压缩为一团(只和仿真有关,和硬件没有关系),解压缩维度声明在向量名字的后面。以上通常用来声明内存数组.
reg [7:0] mem [255:0];//256个解压缩元素,其中每个都是8位reg类型向量
reg mem2 [28:0];//29个解压缩元素,其中每个都是1位reg类型向量
总结:
参考:https://blog.csdn.net/coachip/article/details/114697785