assign相当于连线,一般是将一个变量的值不间断地赋值给另一个变量,就像把这两个变量连在一起,所以习惯性的当做连线用,比如把一个模块的输出给另一个模块当输入。
例如:
wire A,B,SEL,L//声明4个线型变量
assign L=(A&~SEL)|(B&SEL)//连续赋值
在assign语句中,左边变量的数据类型必须是wire型。input和output如果不特别声明类型,默认是wire类型。
举例2选1的数据选择器:
module mux2x1_df(A,B,SEL,L)
input A,B,SEL
output L
assign L=SEL?A:B
endmodule
扩展资料:注意事项
assign的功能属于组合逻辑的范畴,应用范围可概括为以下三点:
1、持续赋值;
2、连线;
3、对wire型变量赋值,wire是线网,相当于实际的连接线,如果要用assign直接连接,就用wire型变量。wire型变量的值随时变化。其实以上三点是相通的。
要更好的把握assign的使用,Verilog中有几个要点需要深入理解和掌握:
1、在Verilog module中的所有过程块(如initial块和always块)、连续赋值语句(如assign语句)和实例引用都是并行的。在同一module中这三者出现的先后顺序没有关系。
2、只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于module的功能定义部分。
3、连续赋值assign语句独立于过程块,所以不能在always过程块中使用assign语句。
assign语句是用来对变量进行赋值的。它只能对变量进行赋值,也就是说只能对变量类型的数据进行赋值。这些变量类型可以是基本数据类型,如int、float、char等,也可以是复合数据类型,如数组、结构体、联合体等。在赋值过程中,需要注意变量类型的兼容性,例如不能用一个整型值给一个字符型变量赋值,否则会出现数据类型不兼容的错误。除此之外,还需要注意变量的作用域和生命周期等方面。总之,assign语句是一个关键的语句,对于变量的正确赋值和程序的正确运行起着至关重要的作用。众所周知,iOS开发中,assign和weak都是弱引用,基础数据类型我们一般都是用assign修饰,而对象一般都是用weak修饰的。那么问题来了,如果用assign修饰对象,会产生什么的后果?
在弄清之前,我们首先要了解一下内存管理机制。我们初始化一个对象如下:
Objct *obc =[ [Objct alloc]init]
@property(assign)int a
@property(assign) Objct *obc
对于以上 Objct 对象内存分配控件存在于堆上,而地址指针obc存在于栈上。对于a,内存空间存在于栈上面,都知道存在栈上面的由系统统一管理,不需要程序员去管理,而存在于堆上的空间需要程序员去手动管理的,当我们将对象销毁的时候,对象的内存空间释放,存在于栈指针也会nil,就不会产生野指针了。回到上面问题,如果用assign修饰一个对象后,当对象被释放后,存在于栈上的指针还是存在的,假如此时使用指针,它就是一个野指针了,就容易造成程序崩溃,如果是用weak修饰的对象,则不会产生上面的情况,因为对象销毁的时候,系统会将指针置nil,也就不会产生野指针了。
综上所述,修饰对象用weak,基础数据类型用assign。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)