Verilog中除法运算符(/)的综合实现及门级结构查询
关于Verilog非2的幂除法综合与门级电路查看的问题
问题描述
之前我对非2的幂常数对应的除法运算符/能否被综合存在疑问,用Synopsys Design Vision尝试后发现可以综合,但不清楚如何查看最终综合后的设计功能与结构,也不确定实现是否可行。我的核心问题:
- 能否查看逻辑综合后的门级电路以了解
/除法的实现方式? - 若无法查看,能否说明非2的幂常数除法的可能实现逻辑?
背景
我正在实现一个求解sin和cos泰勒级数前3项的模块,代码示例如下:
reg [31:0] x, x_2, x_3, x_4, x_5; reg signed [31:0] term1, term2, term3, term4, term5; ... term1 = 1 << 16; // Q16.16 format term2 = x_2 / 2; // x terms also already converted to Q16.16 term3 = x_4 / 24; cos_sum = term1 - term2 + term3;
sin的实现流程类似,仅项和除法常数不同,代码已通过-45至45度输入的测试用例。
解答
1. 查看综合后的门级电路(Synopsys Design Vision)
完全可以查看,有两种常用方式:
- 导出门级网表后查看:在Design Vision的命令行中执行以下命令,将综合后的门级设计导出为Verilog文件:
导出后可以用任意支持Verilog的EDA工具打开网表,查看具体的门级结构和连接关系。write -format verilog -hierarchy -output gate_level_netlist.v - 在Design Vision GUI中直接查看:
- 完成综合后,点击顶部菜单的
Window -> Schematic打开原理图查看器; - 或者在命令行输入
gui::show_schematic,直接加载当前设计的门级原理图,你可以逐层展开模块,找到除法运算对应的逻辑单元。
- 完成综合后,点击顶部菜单的
2. 非2的幂常数除法的实现逻辑
对于常数除数(比如你代码中的24),综合器不会生成传统的迭代除法器(资源占用高、延迟大的结构),而是会做极致优化,通常用定点乘法+移位+加法的组合实现,核心思路是把除法转换成乘以除数的倒数:
- 比如除以24,先计算1/24的定点近似值(对应你的Q16.16格式,1/24≈0.041666,乘以2^16即65536后得到约2730);
- 综合器会将
x_4 / 24优化为(x_4 * 2730) >> 16,同时还会进一步拆分优化(比如24=8×3,先右移3位实现除以8,再对结果做除以3的近似乘法),以此减少资源消耗、提升运算速度。 - 而对于2的幂除数(比如你的
/2),综合器会直接转换成右移1位的操作,这是最节省资源的实现方式。
内容的提问来源于stack exchange,提问作者Sammy Watt
相关产品推荐
相关产品推荐

