Verilog:你能在always @或begin/end语句中加上"assign"语句吗?

vet*_*982 4 verilog

这是允许的吗?

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*rty 9

你可以,它被称为"程序性连续分配".它覆盖了普通的程序分配,似乎没有在您发布的代码中调用它们.我不确定它们是否可合成,但无论如何我都没有理由使用它们.

关于您的代码的注释 - 您y的敏感性列表中缺少:例如always @( w or y )always @(*)更安全.

  • 作为SystemVerilog的一部分,程序连续分配已被弃用.它们不是一个好主意,因为它们不是可合成的,它们可以使模拟变得混乱. (4认同)

too*_*lic 6

根据Marty的回答,您应该阅读IEEE Verilog标准(例如1364-2005)的9.3节,其中描述了"程序连续分配".规范允许块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);
Run Code Online (Sandbox Code Playgroud)