仅对英特尔可见 — GUID: mtr1430270845745
Ixiasoft
仅对英特尔可见 — GUID: mtr1430270845745
Ixiasoft
2.4.1.1.1. 香农分解示例
示例电路根据与目标值的关系从internal_total值加入或减去一个输入值。电路的核心是target_loop模块,如 香农分解前的源代码中所示。
香农分解前的源代码
module target_loop (clk, sclr, data, target, running_total); parameter WIDTH = 32; input clk; input sclr; input [WIDTH-1:0] data; input [WIDTH-1:0] target; output [WIDTH-1:0] running_total; reg [WIDTH-1:0] internal_total; always @(posedge clk) begin if (sclr) begin internal_total <= 0; end else begin internal_total <= internal_total + ((( internal_total > target) ? -data:data)* (target/4)); end end assign running_total = internal_total; end module
该模块基于使能Hyper-Retiming的建议来使用一个同步清除。
香农分解前的Fast Forward Compile报告显示了在寄存器环中例化的target_loop模块的Fast Forward Compile报告。
通过在Fast Forward Compile中添加一个流水线级,Hyper-Retiming报告约为302 MHz。最后的Fast Forward Limit行表示关键链是一个环路(loop)。检查关键链报告显示链段中存在重复结构。此重复结构在优化环路部分中显示为一个示例。
一个关键链子环路的单元显示了在之前示例代码中实现表达式的结构。功能模块对应于比较,加法和乘法运算。每个算术模块名称中的零是网表中综合名称的一部分。零是因为模块是由综合创建的那些运算符的第一个零索引实例。
这个表达式是香农分解的一个候选表达式。您可以同时执行以下两个计算,而不是只对数据的正值或负值执行一次加法运算:
- internal_total - (data * target/4)
- internal_total + (data * target/4)
您可以使用比较表达式internal_total > target的结果来选择要使用的计算结果。此代码的修改版本(使用Shannon分解来实现internal_total计算)显示在香农分解后的源代码中。
香农分解后的源代码
module target_loop_shannon (clk, sclr, data, target, running_total); parameter WIDTH = 32; input clk; input sclr; input [WIDTH-1:0] data; input [WIDTH-1:0] target; output [WIDTH-1:0] running_total; reg [WIDTH-1:0] internal_total; wire [WIDTH-1:0] total_minus; wire [WIDTH-1:0] total_plus; assign total_minus = internal_total - (data * (target / 4)); assign total_plus = internal_total + (data * (target / 4)); always @(posedge clk) begin if (sclr) begin internal_total <= 0; end else begin internal_total <= (internal_total > target) ? total_minus:total_plus); end end assign running_total = internal_total; endmodule
香农分解后的Fast Forward Summary报告显示了通过修改代码对设计进行重新编译后性能几乎翻了一番。