Verilog的:你能把范围内一直“分配”语句@或开始/结束语句?(Verilog: Can you

2019-09-02 03:33发布

这可以吗?

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

Answer 1:

你可以,它被称为“程序连续分配”。 它覆盖了普通程序的任务,似乎没有要在你发布的代码为他们打个电话。 我不知道,如果他们是综合的,但我从来没有原因反正使用它们。

在你的代码的注释-你缺少y从你的敏感名单:比如always @( w or y )always @(*)更安全。



Answer 2:

在马蒂的回答为基础,你应该阅读的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);


Answer 3:

分配是用于提供Verilog线连续赋值语句。 分配语句不程序块中去,如始终。 寄存器可在一个始终块被赋予的值。

指定的语句可以被看作是:

 always @(*)

报表电线。



Answer 4:

该过程连续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。



Answer 5:

是的,但你不想。 由于x []不依赖于x []的顺序并不重要。 只要使用的<=代替分配=。



Answer 6:

没有必要使用一个程序块内分配(在这种情况下总是)

分配是一个连续的分配,它有一个程序块外面去。



Answer 7:

  1. 从电路层次的思考:这总是(W)开始.....结束,所以它里面所有的代码将被激活,每当W¯¯即它属于或提高而改变。
  2. 分配语句需要它分配到一些金属丝或者寄存器输出引脚/端口
  3. 它的一个完整的组合电路,我不能看到同一只为W激活,那是谁/什么电路将使其对唯一的变化时,W按上升或下降
  4. 反正你不能因为我说这需要你把针分配使用赋值语句一个寄存器输出的一些线/ REG输出/仅被分配的端口
  5. 无论如何,如果你去了基本的Verilog,而不是所谓的“程序连续赋值”我猜它的怪异使用相同的。


文章来源: Verilog: Can you put “assign” statements within always@ or begin/end statements?
标签: verilog