这可以吗?
input w;
input [8:0]y;
output reg [8:0]x;
always@(w)
begin
//x[0] or A is never on in any next state
assign x[0] = 0;
assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B
assign x[2]= (y[1]&~w); //C
assign x[3]= (y[2]&~w); //D
assign x[4]= (y[3]&~w) | (y[4]&~w); //E
assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F
assign x[6]= (y[5]&w);
assign x[7]= (y[6]&w);
assign x[8]= (y[7]&w) | (y[8]&w);
end
你可以,它被称为“程序连续分配”。 它覆盖了普通程序的任务,似乎没有要在你发布的代码为他们打个电话。 我不知道,如果他们是综合的,但我从来没有原因反正使用它们。
在你的代码的注释-你缺少y
从你的敏感名单:比如always @( w or y )
或always @(*)
更安全。
在马蒂的回答为基础,你应该阅读的IEEE标准的Verilog第9.3(1364年至二零零五年为例),它描述的“程序连续分配”。 该规范允许assign
的中的语句always
块。 但是,从我的经验,这是相当罕见的。
与您的代码的另一个问题是,它与我尝试了两种不同的模拟器编译错误。 两者产生位选择或部分选取不能在分配的左手侧使用错误消息。
另一种可能的解决方案是摆脱了always
块,并且只使用简单的连续作业。
input w;
input [8:0] y;
output [8:0] x;
assign x[0] = 0;
assign x[1]= (y[0]&~w) | (y[5]&~w) | (y[6]&~w) | (y[7]&~w) | (y[8]&~w); //B
assign x[2]= (y[1]&~w); //C
assign x[3]= (y[2]&~w); //D
assign x[4]= (y[3]&~w) | (y[4]&~w); //E
assign x[5]= (y[0]&w) | (y[1]&w) | (y[2]&w) | (y[3]&w) | (y[4]&w); //F
assign x[6]= (y[5]&w);
assign x[7]= (y[6]&w);
assign x[8]= (y[7]&w) | (y[8]&w);
分配是用于提供Verilog线连续赋值语句。 分配语句不程序块中去,如始终。 寄存器可在一个始终块被赋予的值。
指定的语句可以被看作是:
always @(*)
报表电线。
该过程连续assign
语句的用意是写MUX样行为的优化方式。 举例来说,如果你有
always @(A or B or select)
if (select)
out = A;
else
out = B;
你可以这样写
always @(select)
assign out = A;
else
assign out = B;
但是,人们不喜欢对付列表的灵敏度,所以@(*)
加入的Verilog,和SystemVerilog加入always_comb
。
但对于这种构造真正的杀手锏是,很多人会写出这样的代码
always @(*)
assign out = A;
它模拟罚款,但你现在有性能上的双重惩罚,因为assign
语句已以A的变化很敏感,但这样是always
块。 这种重复执行程序assign
语句替换相同RHS。
是的,但你不想。 由于x []不依赖于x []的顺序并不重要。 只要使用的<=代替分配=。
文章来源: Verilog: Can you put “assign” statements within always@ or begin/end statements?