Verilog 您能否在多个always块中使用/操作相同的output/reg变量? 始终@(posedge clk)开始 如果(x)开始 计数

Verilog 您能否在多个always块中使用/操作相同的output/reg变量? 始终@(posedge clk)开始 如果(x)开始 计数,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,我可以在multiple always块中使用变量计数吗 不在RTL代码中 这是一个好的设计实践吗 “良好设计实践”不是一个定义明确的术语。您可以在测试台上使用它,但不能使用您所使用的格式。在这种情况下,您必须确保所有“始终”条件都是互斥的 为什么/应该/不应该使用这种方法 如果您有大约10年的代码编写经验,您可以使用它。否则,不要。至于“应该”永远不要 模拟器/合成器如何计算变量“计数” 合成器将拒绝您的代码。模拟器将按照您描述的那样分配一个值。这在代码中意味着:您不知道最后执行的是哪个赋值,

我可以在multiple always块中使用变量计数吗

不在RTL代码中

这是一个好的设计实践吗

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

为什么/应该/不应该使用这种方法

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

模拟器/合成器如何计算变量“计数”

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

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

为什么问你能不能试试

我可以在multiple always块中使用变量计数吗

不在RTL代码中

这是一个好的设计实践吗

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

为什么/应该/不应该使用这种方法

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

模拟器/合成器如何计算变量“计数”

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

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


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

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

您可以读取多个块中的信号,但只能在单个块中写入

在大多数情况下,您不希望有多个驱动程序。如果你有一个类似于有多个可能的主节点的总线,那么你需要多个驱动器,但是他们需要驱动总线通过三个州,并且你需要确保主节点具有独占访问权限

混合使用
posedge
negedge
不是一个好主意

对于单个块,您可能会编写类似这样的代码(适用于UP1、DOWN1和DOWN2的宏或参数)

始终@(posedge时钟或negedge重置)
开始
如果(重置=1'b0)
开始

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

您可以读取多个块中的信号,但只能在单个块中写入

在大多数情况下,您不希望有多个驱动程序。如果你有一个类似于有多个可能的主节点的总线,那么你需要多个驱动器,但是他们需要驱动总线通过三个州,并且你需要确保主节点具有独占访问权限

混合使用
posedge
negedge
不是一个好主意

对于单个块,您可能会编写类似这样的代码(适用于UP1、DOWN1和DOWN2的宏或参数)

始终@(posedge时钟或negedge重置)
开始
如果(重置=1'b0)
开始

计数否。不能从多个始终块分配到网络

这是Synopsys设计编译器中2个实现的综合结果

来自多个始终块的分配。

always @(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
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)
模块温度(时钟、rst、x、y、op);
输入逻辑时钟,rst;
逻辑[1:0]计数;
输入逻辑x,y;
输出逻辑[1:0]运算;
分配op=计数;
始终@(posedge clk)开始
如果(x)开始

计数否。不能从多个始终块分配到网络

这是Synopsys设计编译器中2个实现的综合结果

来自多个始终块的分配。

always @(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
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)
模块温度(时钟、rst、x、y、op);
输入逻辑时钟,rst;
逻辑[1:0]计数;
输入逻辑x,y;
输出逻辑[1:0]运算;
分配op=计数;
始终@(posedge clk)开始
如果(x)开始
计数