3

我需要在 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。这将与案例陈述或连接范式的赋值一样有效吗?

4

5 回答 5

5

你所拥有的很好。案例陈述也同样适用。这只是你希望表达的方式的问题。

如果选择编码没有任何特殊含义(例如内存地址选择器),则您的解决方案(索引)可以正常工作。如果选择编码确实对您的设计者有一些特殊的语义含义(并且没有太多),那么请使用 case 语句和枚举。

综合来说,使用哪一个并不重要。任何体面的综合工具都会产生相同的结果。

于 2008-09-15T23:23:26.850 回答
3

我完全同意达拉斯。使用案例陈述 - 它使您的意图更清晰。综合工具会将其构建为查找表(如果它是并行的),并将尽可能优化。

另外,我不会太担心保持 RTL 代码简短。我会先拍摄清楚。合成工具比你想象的要聪明...

于 2008-09-04T13:14:46.813 回答
2

我的偏好 - 如果它对您的问题有意义 - 是使用枚举或“定义”的 case 语句。任何使代码审查、维护和验证更容易的东西。

于 2008-09-04T03:29:04.257 回答
2

对于这样的事情,RTL 清晰度远远胜过一切。SystemVerilog 具有特殊的 always 块指令,以明确何时应将块合成为组合逻辑、锁存器或触发器(如果您编写的 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
于 2008-09-19T05:07:47.323 回答
1

显然我正在使用一个糟糕的综合工具。:-) 我刚刚合成了两个版本(只是模块使用基于扇出线延迟的模型),并且问题中的索引版本比案例陈述提供了更好的时间和面积结果。使用 Synopsys DC Z-2007.03-SP。

于 2008-10-12T17:50:24.297 回答