5

这是允许的吗?

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
4

7 回答 7

9

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

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

于 2009-10-29T11:20:55.173 回答
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);
于 2009-10-29T23:54:45.507 回答
3

程序连续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 的过程语句。

于 2018-06-25T15:34:55.880 回答
2

赋值是一个连续赋值语句,与 Verilog 中的连线一起使用。分配语句不会进入程序块(例如总是)。可以在 always 块中给寄存器赋值。

赋值语句可以看成:

 always @(*)

电线的声明。

于 2014-04-28T09:45:50.350 回答
0
  1. Thinking from the circuit level: this always(w) begin ..... end , so every code inside it will be activated whenever w is changed ie it falls or raise .
  2. assign statement requires pin/port which it assign to some wire or reg output
  3. its a complete combinational circuit I am unable to see how the same will only activate at w, that is who/what circuit will make it to only change when w either rises or fall
  4. anyway you cant assign a reg output to some wire/reg output using assign statement because as I said it requires you to put pin/port to be assigned only
  5. anyway if you go for basic verilog and not so called "Procedural Continuous Assignment" i guess its weird to use the same .
于 2014-09-30T11:26:47.590 回答
0

是的,但你不想这样做。由于 x[] 不依赖于 x[] 顺序无关紧要。只需使用 <= 而不是分配 =。

于 2009-10-29T19:09:57.267 回答
0

不需要在程序块内使用 assign (在这种情况下总是)

分配是一个连续的分配,它必须超出程序块。

于 2013-07-29T19:53:59.667 回答