从硬件角度来看,以下两种逻辑实现有什么区别?
What is a difference between following two logic implementation from Hardware perspective?
实施 1:
logic [2:0][3:0] reg0; // Packed
always_ff@(clk_a)
reg0[1:0] <= in0[1:0];
always_ff@clk_b)
reg0[3:2] <= in1[1:0];
实施 2:
logic [2:0] reg0 [3:0]; // unpacked
always_ff@(clk_a)
reg0[1:0] <= in0[1:0];
always_ff@clk_b)
reg0[3:2] <= in1[1:0];
为什么工具会给我实施 1 的多驱动程序错误?
不同之处在于 LRM 认为变量。不允许对来自不同进程的同一个变量进行多次赋值。打包数组被视为变量,如果是未打包数组,每个元素也被视为变量。这种限制的原因更多地与有效的模拟实现有关,而不是真正与硬件实现有关,并且在 LRM 的其他地方使用了关于什么构成变量的区别(即通过引用传递)。
实施 1:
logic [2:0][3:0] reg0; // Packed
always_ff@(clk_a)
reg0[1:0] <= in0[1:0];
always_ff@clk_b)
reg0[3:2] <= in1[1:0];
实施 2:
logic [2:0] reg0 [3:0]; // unpacked
always_ff@(clk_a)
reg0[1:0] <= in0[1:0];
always_ff@clk_b)
reg0[3:2] <= in1[1:0];
为什么工具会给我实施 1 的多驱动程序错误?
不同之处在于 LRM 认为变量。不允许对来自不同进程的同一个变量进行多次赋值。打包数组被视为变量,如果是未打包数组,每个元素也被视为变量。这种限制的原因更多地与有效的模拟实现有关,而不是真正与硬件实现有关,并且在 LRM 的其他地方使用了关于什么构成变量的区别(即通过引用传递)。