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