你能在多个always块中使用/操作相同的输出/ reg变量吗?

时间:2018-05-31 10:41:17

标签: verilog system-verilog hdl

init=
  • 我可以将多个始终阻止内的变量计数?
  • 这是一个很好的设计实践吗?
  • 为什么/应该/不应该使用此方法?
  • 模拟器/合成器如何对该变量'count'进行计算?
  • 如果我这样做,编译器会抛出错误吗?

3 个答案:

答案 0 :(得分:2)

  

我可以在多个always块中使用变量计数吗?

不在RTL代码中。

  

这是一个很好的设计实践吗?

“良好的设计实践”并不是一个定义明确的术语。您可以在测试平台中使用它,但不能使用您使用的格式。在这种情况下,您必须确保所有始终条件都是互斥的。

  

为什么/应该/不应该使用此方法?

如果您有大约10年的代码编写经验,可以使用它。否则不要。至于“应该”永远不会!

  

模拟器/合成器如何对该变量'count'进行计算?

合成器将拒绝您的代码。模拟器将按照您的描述分配值。在你的代码中意味着:你不知道最后执行了哪个赋值,因此结果是不可预测的。

  

如果我这样做,编译器会抛出错误吗?

为什么询问你是否可以尝试?

答案 1 :(得分:0)

我不是硬件设计师,但这并不好。您的3个count块将全部推断出一个寄存器,它们将全部驱动posedge信号。

你可以在多个块中读取信号,但是你应该只在一个块中写入它们。

在大多数情况下,您不想拥有多个驱动程序。如果您有类似总线的多个可能的主机,那么您将需要多个驱动程序,但是它们需要通过三态驱动总线,并且您需要确保主机具有独占访问权。

混合negedgealways @(posedge clk or negedge reset_n) begin if (reset_n == 1'b0) begin count <= 32'b0; end else begin case (count_control) UP1: count <= count + 1'b1; DOWN2: count <= count - 2'b10; DOWN1: count <= count - 1'b1; endcase end end 不是一个好主意。

使用单个块,您可以编写类似这样的内容(适用于UP1,DOWN1和DOWN2的宏或参数)。

=

答案 2 :(得分:0)

没有。您无法从多个始终阻止的网络分配网络。

以下是Synopsys Design Compiler中的2实现的综合结果

从多个总是阻止的分配。

module temp(clk, rst, x, y, op);
  input logic clk, rst;
  logic [1:0] count;
  input logic x, y;
  output logic [1:0] op;

  assign op = count;

  always @ (posedge clk) begin     
    if (x) begin 
      count <= count + 2'd1;
    end    
  end

  always @ (posedge clk) begin     
    if (y) begin 
      count <= count - 2'd2;
    end    
  end

  always @ (negedge clk) begin     
    if (x) begin 
      count <= count - 2'd1;
    end    
  end
endmodule

// Synthesis Result of elaborate command - 
Error:  /afs/asu.edu/users/k/m/s/kmshah4/temp/a.sv:16: Net 'count[1]' or a directly connected net is driven by more than one source, and not all drivers are three-state. (ELAB-366)
Error:  /afs/asu.edu/users/k/m/s/kmshah4/temp/a.sv:16: Net 'count[0]' or a directly connected net is driven by more than one source, and not all drivers are three-state. (ELAB-366)

总是单独分配。

module temp(clk, rst, x, y, op);
  input logic clk, rst;
  logic [1:0] count;
  input logic x, y;
  output logic [1:0] op;

  assign op = count;

  always @ (clk)
  begin
    if (clk)
    begin
      case ({x, y})
        2'b01 : count <= count - 2'd2;
        2'b10 : count <= count + 2'd1;
        default : count <= count;
      endcase
    end
    else
    begin
      count <= (x) ? (count - 2'd1) : count;
    end
  end
endmodule

// Synthesis Result of elaborate command - 
Elaborated 1 design.
Current design is now 'temp'.
1