我开始知道我们可以在程序块中使用assign语句(比如总是如此),使用“assign”在always块内部和在其外部(与合成电路有关)的区别是什么。我的意思是什么时候总是必须使用assign?
答案 0 :(得分:1)
从不,assign
关键字用于连续分配,它将在综合时生成组合逻辑。实际上,您可以使用always block获取assign
行为:
wire test;
//At all times, test equals input
assign test = input;
相当于:
reg test;
//Each time input changes(with the always@*), test takes its value
always@*
test = input;
在always
块中,您应该只使用非阻塞分配('< ='),这是程序分配。使用阻止分配是可能的,但是,您必须确保按照自己的意愿行事。
来自this thread:
我知道没有例外的两条生活规则:
始终对组合或电平敏感代码使用阻塞分配,以及时钟分配
- 醇>
始终对在时钟边沿写入的变量使用非阻塞分配,在另一个进程中在同一时钟边沿读取。
答案 1 :(得分:1)
赋值和相应的取消分配(在always块中)也称为“程序性连续调整”,可用于特殊用途的always块。在大多数情况下,这是不可合成的,我从来没有遇到它的使用。
一个例子:
reg in1, in2, out;
reg [1:0] select;
always @* begin
case (select)
2'b01: assign out = in1;
2'b10: assign out = in2;
2'b11: deassign out;
endcase // case (select)
end
一般建议 - 不要使用它。