在Verilog中高效合成4对1函数
我需要在Veriog中实现4对1函数。输入是4位,从0到15的数字。输出是一个单一的位,0或者1. 每个输入给出一个不同的输出,并且从输入到输出的映射是已知的,但是输入和输出本身不是。我希望vcs成功地优化代码,并使其尽可能短/整齐。到目前为止,我的解决方案:
wire [3:0] a; wire b; wire [15:0] c; assign c = 16'b0100110010111010; //for example but could be any constant assign b = c[a];
必须声明c很难看,我不知道vcs是否会在那里识别K-map。这项工作以及案例陈述或者合取正常形式的作业是否有效?
解决方案
回答
如果问题有意义,我更喜欢使用enums或者`defines的case语句。使代码检查,维护和验证更加容易的任何事情。
回答
我完全同意达拉斯。使用案例陈述可以使意图更加清晰。综合工具会将其构建为查找表(如果是并行表),并将对其进行优化。
另外,我也不会担心让RTL代码简短。为了清楚起见,我会先拍摄。综合工具比我们想象的要聪明...
回答
你所拥有的很好。案例说明也同样适用。这只是我们希望表现出多大程度的问题。
如果选择编码没有任何特殊含义(例如,内存地址选择器),则索引解决方案可以正常工作。如果选择编码确实对设计人员具有一些特殊的语义含义(并且选择的含义不多),则可以使用case语句和枚举。
综合明智地,使用哪一个都没关系。任何体面的综合工具都会产生相同的结果。
回答
对于这样的事情,RTL的清晰度远胜于所有。 SystemVerilog具有特殊的Always Block指令,以明确何时将块合成为组合逻辑,锁存器或者触发器(如果编写的RTL与之冲突,则综合工具应抛出错误(例如,不包括所有信号)。也请注意,除非该编码本身传播到引脚,否则该工具可能会用硬件效率最高的编码(最小化整个设计面积的编码)替换我们拥有的任何编码。顶层模块。
这个建议也很普遍。使代码易于人类理解,并且综合工具也可能更易于理解,这使它可以更有效地将数千年的算法研究工作带给RTL。
如果愿意,我们还可以使用三元运算符对其进行编码,但是我更喜欢以下内容:
always_comb //or "always @*" if you don't have an SV-enabled tool flow begin case(a) begin 4'b0000: b = 1'b0; 4'b0001: b = 1'b1; ... 4'b1111: b = 1'b0; //If you don't specify a "default" clause, your synthesis tool //Should scream at you if you didn't specify all cases, //Which is a good thing (tm) endcase //a end //always
回答
显然我正在使用糟糕的综合工具。 :-)我只是综合了这两个版本(只是模块使用了基于扇出的模型来处理线路延迟),而问题的索引版本比case语句提供了更好的时序和面积结果。使用Synopsys DC Z-2007.03-SP。