我正在尝试想出一种方法来添加寄存器的各个位。
例如,if regA = 111000 then regB = 3
(位的总和regA
)。
1)Verilog或SystemVerilog中是否有可以直接使用的可综合函数/运算符来执行此操作?
如果不是,那么问题可能有点有趣,特别是因为操作必须在一个时钟周期内完成(纯组合逻辑)并且寄存器宽度是可参数化的。
2)如果没有内置的 Verilog 或 SystemVerilog 运算符,那么该怎么办?
谢谢,
乌杰瓦尔
Verilog(IEEE 标准 1364-2001 或更新版本):
integer i;
always @* begin
B = WIDTH_LOG2'b0;
for (i=0; i<WIDTH; i=i+1)
B = B + A[i];
end
SystemVerilog(IEEE Std 1800-2005 或更高版本):
always_comb begin
B = '0; // fill 0
foreach(A[i])
B += A[i];
end
两者都会合成组合逻辑。没有锁存器或触发器。
SystemVerilog确实有$countones()
,但我不确定它是否可以合成。那么是:always_comb B = $countones(A)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)