马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 iNostory 于 2019-2-8 12:15 编辑
1、连续赋值和过程赋值之间有什么区别? 连续赋值 | 过程赋值 | 主要赋值给 nets | 主要赋值给 reg变量 | 用来生成组合逻辑 | 用来生成存储单元,触发器、锁存器和组合逻辑 | 用于assign语句 | 用于always、initial、task、function语句 | 示例: wire out1 = in1 & in2 ; assign out1 = in1 & in2 | 示例: always @(posedge clk)
reg1 <= in1 ; always@(a or b or s)
y = (s == 1) ? a : b ; |
2、initial和always中的赋值有什么区别? initial和always中的赋值都是过程赋值。 initial | always | initial语句块中赋值是在仿真时间0按特定顺序执行,并且只会执行一次 | 从仿真时间0开始,敏感列表变化时重复执行 | 不可综合 | 可综合 | 示例: reg [1:0] out1 , out2 ; initial begin
out1 = 2’b10 ; #5 out2 = 2’b01 ; end | 示例: reg [1:0] out1 , out2 ; always@(posedge clk) begin
out1 <= int1 ; out2 <= out1 & in2 ; end |
3、阻塞和非阻塞赋值之间有什么区别? 阻塞和非阻塞赋值都是过程赋值。 阻塞赋值 | 非阻塞赋值 | 阻塞赋值中,右边表达式自动更新到左边表达式(如果不指定delay) | 非阻塞赋值中,右边表达式在下一个周期才会更新到左边表达式 | 在一个进程中存在多个阻塞赋值时,当前阻塞赋值会“阻塞”下一个阻塞赋值 | 在一个进程中存在多个非阻塞赋值时,多个非阻塞赋值会同时进行 | 建议在组合always语句块中使用阻塞赋值 | 建议在时序always语句块中使用非阻塞赋值 | 能在连续赋值语句assign和过程赋值initial、always语句中使用 | 只能在过程赋值initial、always语句中使用 | 用
= 表示 | 用 <= 表示 | 示例: initial begin
reg1 = #10 2’b10 ; reg2 = # 5 2’b01 ; end reg1在10个时间单位赋值,reg2在15个时间单位赋值。 reg2赋值发生在reg1赋值完成之后 | 示例: initial begin
reg1 <= #10 2’b10 ; reg2 <= #5 2’b01 ; end reg1在10个时间单位赋值,reg2在5个时间单位赋值。 reg2赋值发生在reg1赋值之前 | | |
4、如何使用连续赋值建模双向nets? assign语句构成一个连续赋值。 RHS变化立即影响LHS。
然而,LHS的任何变化都不会影响RHS。 例如,在以下声明,rhsnet的更改将更新到lhsnet,但反之不会。 wire rhs,1hs ; assign lhs = rhs ;
System verilog引入了一个关键字alias,能定义双向nets。 例如,在以下代码中,rhs的任何变化都会更新到lhs,反之亦然。
module test_alias ; wire[3:0] lhs ,rhs ; aliaslhs = rhs ; initial begin forcerhs = 4’h2 ; $display(“lhs= %0h , rhs = %0h”,lhs,rhs) ; release rhs;
force lhs= 4’hc ; $display(“lhs= %0h , rhs = %0h”,lhs,rhs) ; release lhs;
end
endmodule //test_alias
如果上述alias换成assign,则输出如下: lhs = 2 , rhs = 2 lhs = c , rhs = z
然而,由于定义了alias,输出如下: lhs = 2 , rhs = 2 lhs = c, rhs = c
在上面的示例中,对net任何一侧的更改都会更新到另一侧。
持续更新~ |