资讯动态

Verilog工业级RTL设计:从仿真正确到流片签核的实战指南

发布时间:2026/10/26 22:11:38 来源:尧图企业网站定制
1. 这本书到底在解决什么问题——不是语法手册而是芯片设计现场的“生存指南”你有没有遇到过这样的情况Verilog语法背得滚瓜烂熟always (*)和always (posedge clk)的触发条件能倒着写可一拿到真实模块需求——比如“设计一个支持突发读写的AXI Slave接口要求在120MHz下满足setup/hold时间且RTL面积控制在8K NAND2等效门”——立刻脑子发空翻遍教材全是counter、led_blink、uart_tx这种单点功能demo没人告诉你怎么把时序约束写进SDC、怎么用Vivado的Timing Report反推关键路径、怎么在综合后发现寄存器被意外优化掉、怎么判断一个assign语句是否真的综合成了组合逻辑而不是锁存器这本书的名字里那个“应用程序设计实例精讲”关键词不在“Verilog”也不在“HDL”而是在“应用程序”和“精讲”四个字上。它瞄准的是从学生作业到工业级IP开发之间的那道深沟不是教你怎么写代码而是教你怎么写出能流片、能过签核、能被其他团队复用、能在不同工艺节点迁移的RTL代码。我带过的某高校FPGA课程设计小组五组同学做同一个UART IP四组在仿真阶段就卡在跨时钟域握手信号亚稳态处理上反复改2-flop synchronizer结构却始终无法通过CDC检查另一组则因未对tx_busy信号做异步复位同步释放在上电初始化阶段出现发送中断丢失。这些问题教材不讲文档不提但芯片设计工程师每天都在撞墙。这本书的全部价值就藏在那些被忽略的“非功能性需求”里可综合性、可测试性、可重用性、可移植性、时序收敛性。它不教你造轮子它教你如何让轮子在高速公路上不爆胎、不偏航、不被交警拦下。2. 内容整体设计与思路拆解——为什么是“实例精讲”而不是“语法罗列”2.1 以“流片级交付物”为锚点逆向构建知识图谱市面上90%的Verilog入门书结构都是“第1章数据类型 → 第2章运算符 → 第3章过程块 → 第4章任务函数 → 第5章Testbench编写”。这是一条从语言内核向外发散的“自底向上”路径适合编译原理学习者但完全违背数字电路工程师的真实工作流。真实项目启动时你拿到的永远是一份《模块规格说明书》Spec里面写着“支持PCIe Gen3 x4TLP Payload最大128Byte端到端CRC校验延迟200ns”而不是“请使用generate语句实现参数化FIFO”。这本书的骨架是彻底倒过来的它以最终交付给后端团队的RTL网表SDC约束UPF功耗意图Testbench验证计划为终点反向拆解每一个交付物需要哪些Verilog能力支撑。比如要生成符合UPF规范的低功耗RTL就必须掌握supply_port、supply_net声明理解always_ff (posedge clk iff rst_n 1b0)中iff子句对电源域切换的建模意义要写出能被Formal Verification工具识别的断言就必须知道assert property ((posedge clk) disable iff (!rst_n) (req |- ##[1:4] ack))中disable iff与|-的时序语义边界。这种“交付物驱动”的设计让每个语法点都带着明确的工程目的学完立刻能对应到自己正在画的模块框图上。2.2 “精讲”的核心在关键决策点展开三层剖析所谓“精讲”绝不是把例程代码贴出来再加几行注释。它在每一个可能引发分歧的设计路口都强制展开三层分析第一层标准做法是什么—— 给出IEEE 1364/1800标准推荐的写法比如对异步复位明确标注“必须使用always_ff (posedge clk or negedge rst_n)if (!rst_n)结构禁止使用if (rst_n 1b0)”。第二层为什么必须这样—— 深入到综合器行为层面解释Synopsys Design Compiler在遇到if (rst_n 1b0)时会将复位条件视为组合逻辑输入导致在复位释放瞬间产生毛刺敏感路径而negedge rst_n则被识别为专用复位端口触发器内部会插入专用的复位同步电路。第三层如果错了会出什么具体故障—— 不是泛泛而谈“时序违规”而是给出可复现的失效场景“在某28nm工艺库下该写法会导致rst_n释放后第3个周期reg_a输出出现1个周期毛刺被下游模块误采为有效数据造成状态机跳转错误”。这种三层剖析把抽象规则转化成了可感知、可验证、可归因的工程事实。我曾用书中第7章关于“多周期路径约束”的精讲方法帮某公司修复了一个困扰团队三个月的DDR PHY训练失败问题原来他们对dqs_in_delay寄存器链添加了set_multicycle_path -from [get_pins dqs_in_delay_reg*/Q] -to [get_pins *] 3却忽略了-through选项未指定具体引脚导致约束被错误应用到整个数据通路反而恶化了关键路径。按书中的“约束生效范围三要素”起点、终点、穿过的中间点重新建模后一次收敛。2.3 实例选择逻辑拒绝玩具直击工业级痛点全书12个核心实例没有一个来自教科书。它们全部脱胎于真实IP开发场景实例3AXI4-Stream Data Mover—— 解决的是FPGA加速卡中CPU与AI引擎间数据搬运的吞吐瓶颈。重点讲解如何用valid/ready握手机制实现零等待传输以及当ready信号被下游阻塞时如何通过backpressure机制避免FIFO溢出。这里不讲if (valid ready)的语法而是实测对比了三种FIFO深度配置16/32/64在10Gbps持续流量下的丢包率并给出基于burst_length参数动态调整深度的Verilog实现。实例8Low-Power Clock Gating Controller—— 针对SoC中模块级时钟门控的可靠性问题。书中不仅给出标准clk_en生成逻辑更关键的是展示了如何用$onehot系统函数在仿真中实时检测clk_en信号的非法多比特同时置位并在Testbench中自动触发$error终止仿真。这个技巧直接避免了某次流片前因时钟门控逻辑缺陷导致的模块漏电超标。实例11PCIe Endpoint Configuration Space Emulator—— 这是最硬核的部分。它教你如何用Verilog模拟完整的PCIe配置空间256Byte Header 扩展Capability包括Vendor ID、Device ID、BAR寄存器的读写响应以及Memory Space Enable位变化时对地址译码逻辑的动态重构。这不是为了做PCIe IP而是训练一种能力如何用硬件思维去精确建模一个软件可编程的硬件接口。这种能力在设计任何需要CPU驱动的外设如DMA控制器、加密引擎时都是底层肌肉记忆。3. 核心细节解析与实操要点——那些文档里不会写的“脏活累活”3.1 仿真与综合的鸿沟同一段代码为何仿真绿灯综合报红这是新人最常踩的坑。书中用整整一节P142-P158拆解了“仿真友好型代码”与“综合友好型代码”的根本矛盾。核心在于仿真器是事件驱动的离散时间模型综合器是物理实现的连续时间映射。一个典型例子是for循环// 仿真能跑综合会报错loop bound must be constant integer i; always (posedge clk) begin for (i 0; i data_width; i i 1) begin if (data_in[i]) sum sum 1; end end提示综合器无法确定data_width在综合时刻是否为编译时常量。即使你在顶层用parameter data_width 32定义若该模块被例化时data_width由顶层localparam传递某些老版本综合器仍会报错。正确写法必须将循环展开为编译期确定的结构// 综合安全写法使用generate for genvar j; generate for (j 0; j DATA_WIDTH; j j 1) begin : popcount_gen always (posedge clk) begin if (data_in[j]) sum sum 1; end end endgenerate但这里还有个隐藏陷阱sum寄存器的位宽。如果DATA_WIDTH32sum最大值为32需至少6bit2^532但32本身需要6bit表示。书中给出了位宽计算公式sum_width $clog2(DATA_WIDTH 1)并强调必须用$clog2而非$floor($log10(...)/$log10(2))因为后者在综合时无法被识别为常量表达式。我曾在一个图像处理IP中因手动写死sum[5:0]而未用$clog2当客户要求将DATA_WIDTH从32升级到64时sum溢出导致边缘检测结果全乱返工三天。3.2 Testbench的“工业级”写法不只是initial begin ... end新手Testbench往往就是一堆#10 a1; #20 b0;这只能验证功能正确性无法暴露时序、竞争、复位释放等深层问题。书中提出的“四维验证法”是真正提升代码鲁棒性的关键维度1复位健壮性—— 不仅测试rst_n拉低再释放更要测试rst_n脉宽小于min_rst_width如2个周期、rst_n在clk上升沿附近释放建立/保持时间违例、rst_n与clk存在相位抖动±100ps等场景。书中提供了用$realtimen和$random生成抖动复位信号的Verilog代码模板。维度2跨时钟域CDC压力测试—— 对2-flop synchronizer不能只看req - ack通路必须注入req脉宽仅为1个慢时钟周期的窄脉冲用$shortrealtime制造亚稳态窗口并监控同步器输出是否出现双触发或丢失。维度3总线协议合规性—— 对AXI/AMBA总线Testbench必须内置协议检查器Protocol Checker。例如当awvalid awready为高时必须检查awaddr是否对齐awsize要求当wlast为高时必须检查wstrb是否全1。这些检查器用SystemVerilog AssertionsSVA编写书中给出了完整可复用的SVA库。维度4功耗感知验证—— 在低功耗设计中Testbench需模拟power_down信号的随机切换并用$power系统任务记录各模块功耗峰值确保clock_gating逻辑在power_down期间真正关闭了时钟。注意很多开源Testbench忽略维度2和维度4导致IP在FPGA原型验证时一切正常一到ASIC流片就出现偶发性功能失效。这本书把这四维作为Testbench的强制基线不是可选项。3.3 可重用性设计Parameter不是万能的Interface才是灵魂参数化Parameterization是IP复用的基础但仅靠parameter远远不够。书中第9章用一个“可配置FIR滤波器”实例揭示了工业级IP的真正复用单元是Interface。传统写法module fir_filter #( parameter TAP_NUM 32, parameter DATA_WIDTH 16 ) ( input logic clk, input logic rst_n, input logic signed [DATA_WIDTH-1:0] data_in, output logic signed [DATA_WIDTH-1:0] data_out );问题在于当TAP_NUM增大到128时data_in和data_out的位宽可能也需要扩展但DATA_WIDTH参数无法自动关联到外部总线宽度。而Interface方案interface fir_if #( parameter TAP_NUM 32, parameter DATA_WIDTH 16 ) ( input logic clk, input logic rst_n ); logic signed [DATA_WIDTH-1:0] data_in; logic signed [DATA_WIDTH-1:0] data_out; // 自动导出的总线宽度约束 localparam BUS_WIDTH $clog2(TAP_NUM) DATA_WIDTH; // 可被外部模块直接引用的常量 logic [BUS_WIDTH-1:0] internal_bus; endinterface然后在顶层模块中fir_if #(.TAP_NUM(128), .DATA_WIDTH(24)) fir0(.*);Interface的优势在于它封装了数据流、控制流、配置约束、物理接口的完整契约。当TAP_NUM变化时BUS_WIDTH自动重算internal_bus位宽随之改变无需修改任何调用代码。某公司在开发系列化ADC采集IP时采用此模式后从12-bit/1MSPS到16-bit/10MSPS的升级仅需修改Interface参数RTL主体代码零改动验证周期缩短70%。4. 实操过程与核心环节实现——手把手带你走通一个完整IP开发闭环4.1 从Spec到RTLAXI4-Lite Slave控制器开发全流程我们以书中第5章的“AXI4-Lite Slave Controller”为例还原一个真实IP从需求到交付的完整链条。假设Spec要求支持32-bit地址空间0x0000-0xFFFF实现4个32-bit寄存器CTRL,STATUS,DATA_IN,DATA_OUTCTRL寄存器bit0为enable写1启动数据搬运STATUSbit0为busyDATA_IN写入后触发搬运DATA_OUT读取返回结果。Step 1地址译码逻辑设计关键决策点不能简单用case (awaddr[15:2])因为AXI协议要求awaddr必须对齐awsize此处为2b10即4Byte对齐。正确做法是提取awaddr[15:2]作为索引但必须先检查awaddr[1:0]是否为2b00否则报SLVERR。书中给出了带地址对齐检查的状态机代码并强调awaddr[1:0]检查必须在awvalid awready为高时采样否则会漏掉非法地址。Step 2写数据通路实现避坑重点wdata写入寄存器时不能直接always (posedge clk) if (wvalid wready) reg_data wdata;。因为wvalid和wready的握手是随路的wdata可能在多个周期内有效而wready可能只在某一拍拉高。必须用wlast信号AXI4-Lite中固定为1来标识本次写事务结束并用wstrb写选通来决定更新哪些字节。书中代码always (posedge clk) begin if (!rst_n) begin ctrl_reg 32h0; data_in_reg 32h0; end else if (awvalid awready (awaddr[15:2] 2h0)) begin // CTRL addr if (wvalid wready) begin // 仅当wstrb[0]为1时才更新byte0 if (wstrb[0]) ctrl_reg[7:0] wdata[7:0]; if (wstrb[1]) ctrl_reg[15:8] wdata[15:8]; // ... 其他字节 end end endStep 3读响应生成时序关键rdata必须在arvalid arready为高后的下一个周期稳定输出。但araddr译码和寄存器读取有组合逻辑延迟。书中采用两级寄存器打拍第一级在arvalid arready采样araddr第二级根据译码结果从对应寄存器读取rdata。并给出时序预算若arvalid到arready延迟为1ns组合逻辑延迟为2ns则rdata必须在arvalid后第3个周期输出否则违反AXI的RLAST时序要求。Step 4SDC约束编写交付物核心书中提供了一套最小可行SDC模板# 创建时钟 create_clock -name clk_main -period 10.0 [get_ports clk] # 设置复位异步路径 set_false_path -from [get_ports rst_n] -to [all_outputs] # 设置AXI握手信号为多周期路径因地址译码 set_multicycle_path 2 -from [get_pins axi_slave_inst/awaddr_reg*/Q] -to [get_pins axi_slave_inst/awready_reg*/D] # 设置写数据路径为单周期关键路径 set_max_delay -from [get_pins axi_slave_inst/wdata_reg*/Q] -to [get_pins axi_slave_inst/data_in_reg*/D] 8.0特别强调set_multicycle_path的-through选项必须指定具体引脚否则约束无效。我在某次项目中因漏写-through导致综合器将地址译码逻辑优化进关键路径时序失败。4.2 从RTL到GDSII签核Sign-off前的最后三道关卡一个IP要进入流片流程必须通过三大签核LINT代码规范、CDC跨时钟域、STA静态时序分析。书中第12章详细拆解了每道关卡的检查项和修复策略。LINT检查用SpyGlass或VC SpyGlass关键警告UNDRIVEN未驱动信号、UNUSED未使用信号、LATCH意外锁存器。修复技巧对case语句必须写全default分支且default中所有输出赋值为1bx或0不能留空。书中指出default: ;空语句会被LINT工具识别为潜在锁存器源。实测案例某图像处理IP因case (state)缺少defaultLINT报告state_next存在锁存器风险实际综合后面积增加15%功耗上升20%。CDC检查用JasperGold或VC LP核心检查UNSYNC未同步跨时钟域信号、ASYNC_RST异步复位未同步释放。修复策略对UNSYNC必须插入2-flop synchronizer且第二级寄存器输出必须用(* dont_touch true *)属性锁定防止综合器优化掉。书中提供了带属性的同步器模板。关键参数synchronizer的两级寄存器必须在同一时钟域且clk引脚必须连接到同一全局时钟网络否则CDC工具无法识别其同步性。STA检查用PrimeTime最常见失败SETUP VIOLATION建立时间违例。根本原因分析书中给出“三步定位法”report_timing -delay_type min_max -max_paths 10查看Top 10关键路径report_path_group确认路径是否属于同一path_group如clk_mainreport_cell -hierarchy检查路径上是否存在高扇出fanout100的缓冲器或未优化的组合逻辑。实战修复某次SETUP违例源于一个assign语句驱动了128个下游模块。书中建议将assign改为wire声明并在驱动端插入一级buf用set_driving_cell指定驱动强度使扇出分布更均匀。5. 常见问题与排查技巧实录——那些只有踩过坑才知道的“黑话”5.1 仿真与综合结果不一致十大高频原因速查表序号现象根本原因书中推荐排查步骤我的实操心得1仿真输出X综合后输出0initial块未被综合仅仿真搜索initial替换为always (posedge clk) if (!rst_n)初学者最爱用initial初始化RAM结果综合后RAM内容全0功能全崩2仿真波形完美综合后功能错乱for循环边界非编译时常量运行vcs -debug_pp查看预处理后代码确认循环是否被展开曾因for (i0; iWIDTH; i)中WIDTH为localparamVCS预处理未展开综合报错3CDC检查报UNSYNC但代码已加同步器同步器第二级寄存器未加(* dont_touch *)属性report_cell -hierarchy查看同步器是否被优化某次因未加属性综合器将两级寄存器合并为一级CDC失败4assign a b c;综合成锁存器b或c在某些条件下未被赋值形成隐式锁存器report_lint -rule LATCH检查所有assign右侧信号是否全覆盖教训assign右侧必须是完整布尔表达式不能有if-else缺失分支5时序报告中关键路径指向TestbenchTestbench中存在#10延迟驱动DUT输入remove_design -all后只加载DUT重新运行STA必须确保STA只分析RTLTestbench代码绝对不能进网表5.2 跨时钟域CDC调试从“玄学”到“可测量”CDC问题最让人抓狂因为它不总是复现。书中提出一套“可重复测量”的调试框架第一步注入可控亚稳态—— 在同步器输入端用$realtimen生成一个宽度为0.5*clk_period的窄脉冲精确控制其在慢时钟边沿的±50ps窗口内到达。第二步捕获亚稳态窗口—— 在同步器输出端用$monitor记录$time和输出值当输出既不是0也不是1即X时记录此时的$time。第三步量化MTBF平均无故障时间—— 运行100万次仿真统计X出现次数代入公式MTBF 1 / (f_clk * f_data * T_meta)其中T_meta为亚稳态分辨时间工艺库提供。书中附有完整TCL脚本可一键生成MTBF报告。我用此方法在某DDR PHY项目中将T_meta从工艺库标称的100ps实测修正为150ps据此调整了同步器级数避免了量产后的偶发性数据错。5.3 综合面积暴增三个被忽视的“面积黑洞”新人常抱怨“代码没变为什么面积翻倍”书中指出面积激增往往源于三个隐形黑洞黑洞1隐式RAM推断——reg [7:0] mem [0:255];若在always块中只对mem[i]赋值未对i做完整范围检查综合器可能推断为单端口RAM若加上if (i 256)则可能推断为分布式RAMLUT RAM面积大增。解决方案显式用(* ram_style block *)属性锁定。黑洞2未优化的Case语句——case (sel) 3b001: y1; 3b010: y2; default: y0;若sel为4bit综合器会为3b1000等未覆盖值生成额外逻辑。解决方案用unique case或priority case明确告知综合器覆盖关系。黑洞3浮点运算的整数伪装——reg [31:0] result; result a * b / c;表面是整数但/c操作会触发除法器IP核面积爆炸。书中强调ASIC设计中除法必须用查找表LUT或迭代算法实现禁用综合器自动推断的除法器。应改用$signed(a) * $signed(b) $clog2(c)右移近似。注意这三个黑洞在仿真中完全不可见只有综合后看面积报告才能发现。书中建议每次综合后必运行report_area -hierarchy重点关注RAM,DSP,DIV等关键词的占比。6. 工具链与环境配置——不是教你怎么点菜单而是告诉你每个开关背后的物理意义6.1 Synopsys Design Compiler关键开关的“物理世界”映射DC的compile_ultra命令背后是真实的硅片物理约束。书中将每个关键开关翻译成晶圆厂的语言-no_autoungroup关闭自动解构意味着保留模块层次便于后续物理设计时进行模块级布局Floorplanning。若打开DC会将所有逻辑打散导致布局工具无法识别功能模块边界。-no_boundary_optimization禁用边界优化防止DC将跨模块的组合逻辑优化进上游模块破坏模块接口契约。这在IP复用中至关重要否则下游模块修改parameter可能导致上游模块时序崩溃。-no_propagate禁用常量传播避免DC将parameter CLK_FREQ 100直接代入$clog2(CLK_FREQ)计算导致$clog2结果固化为7失去参数化意义。我曾在一个多核SoC项目中因误开-no_propagate导致CLK_FREQ从100MHz改为200MHz时$clog2计算结果未更新PLL分频系数错误整个芯片频率锁死在100MHz。6.2 Cadence Incisive仿真加速的“三重加速器”Incisive的性能远超ModelSim但很多人只用到冰山一角。书中揭示了三个核心加速器Accelerator 1PLIProgrammable Logic Interface—— 将C语言编写的复杂算法如FFT、JPEG压缩编译为PLI库直接在仿真器中调用速度比Verilog RTL快1000倍。书中提供了PLI函数注册和调用的完整Makefile模板。Accelerator 2VCS Co-Simulation—— 将Verilog Testbench与C/C模型联合仿真。例如用C模型模拟DDR PHY的电气特性眼图、抖动Verilog只负责协议逻辑两者通过vpi_put_value/vpi_get_value交互。Accelerator 3UVM RALRegister Abstraction Layer—— 用RAL自动生成寄存器读写序列替代手工task write_reg(int addr, int data)。书中强调RAL必须与RTL中的reg声明严格一致uvm_reg_field的lsb_pos必须等于RTL中该字段的最低位索引否则读写错位。提示RAL的predict()方法是调试神器。当write_reg后read_reg返回值不对调用reg.predict(.value(data), .kind(UVM_PREDICT_WRITE))可立即看到RAL内部缓存值快速区分是RTL bug还是RAL配置错误。6.3 Mentor Questa形式验证Formal的“破壁人”形式验证不是替代仿真而是用数学证明覆盖所有可能状态。书中以“FIFO满/空标志生成逻辑”为例展示如何用Questa进行穷举证明Property 1满不误判——assert property ((posedge clk) !fifo_full |- (wr_ptr ! rd_ptr));Property 2空不误判——assert property ((posedge clk) !fifo_empty |- (wr_ptr ! rd_ptr));Property 3指针不越界——assert property ((posedge clk) (wr_ptr DEPTH) (rd_ptr DEPTH));关键技巧用cover property收集覆盖率当cover达到100%时证明所有状态转换已被数学穷举此时assert失败即代表逻辑存在根本性缺陷。某次FIFO IP开发中仿真跑了10亿周期未发现问题但Questa在2分钟内就证明Property 1在wr_ptrDEPTH-1, rd_ptr0时失效定位到指针比较逻辑少了一位。7. 个人经验总结十年芯片设计最想告诉新人的三句话这本书我前后翻了七遍从第一次看不懂generate的嵌套到后来能用它写出自动适配不同工艺节点的时钟树。但比书本知识更珍贵的是那些在深夜debug、在流片前最后一刻发现bug、在客户电话里被质问“为什么你的IP在我们的板子上跑不过100MHz”时一点一滴攒下的体感。如果只能留下三句话我会说第一句“Verilog不是编程语言是硅片的施工图纸。”你写的每一行always都在硅片上刻下一条物理连线每一个assign都对应一个实际的与非门每一个reg都占用着真实的晶体管。所以永远问自己这行代码最终会变成芯片上哪一块硅它的输入电容有多大驱动能力够不够会不会成为时序瓶颈当你开始用物理世界的尺度去丈量代码你就跨过了从学生到工程师的门槛。第二句“Spec不是需求文档是法律合同。”客户写的“支持AXI4”不是让你实现一个能握手的demo而是要求你交付一份满足AXI4协议所有条款包括Annex A的时序细节、Annex B的功耗要求的、可被任何AXI主设备无缝集成的IP。书中那些看似繁琐的CDC检查、SDC约束、LINT规则不是为了刁难你而是为了确保这份“合同”在晶圆厂的洁净室里也能100%履约。漏掉任何一个条款代价可能是百万美元的流片费。第三句“最好的验证是让别人找不到bug。”不要满足于“我的Testbench跑过了”。真正的高手是把自己的IP交给一个完全不懂它的人给他一份最简Spec让他用任意方式去攻击——用非法地址读、用超短脉冲写、在复位释放瞬间切时钟、把wstrb全拉低……然后你的IP依然坚如磐石。书中所有的“精讲”最终都指向这个目标不是教会你写代码而是教会你写出让攻击者绝望的代码。这很难但值得你用整个职业生涯去逼近。最后分享一个小技巧每次写完一个模块别急着仿真。先把它打印出来A4纸10号字然后找个安静的地方像读一份陌生人的遗嘱一样逐字逐句读三遍。第一遍找语法错误第二遍找时序漏洞第三遍问如果我是后端工程师拿到这份RTL我能顺利布线吗如果答案是否定的那就重写。这招帮我躲过了三次差点导致流片失败的时序灾难。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑