无输入输出端口的HEVC Verilog模块可综合化改造求助
可综合HEVC模块改造与Cadence综合方案
1. 核心改造要点
原模块依赖$readmemh读取本地文件,属于不可综合的系统任务,必须替换为端口输入;同时补充必要的时序控制信号,确保逻辑符合综合要求:
- 保留必填输入
clk - 添加可选复位信号
rst_n(提升鲁棒性) - 添加数据输入端口
input_data(位宽匹配原txt文件数据位宽) - 添加数据有效信号
data_valid(控制数据加载时序) - 保留要求的所有输出端口,可选添加
output_valid(标识输出数据有效)
2. 改造后模块代码示例
假设原模块名为hevc_core,改造后代码如下(需根据实际数据位宽、缓冲区大小调整):
module hevc_core ( input clk, input rst_n, input data_valid, input [7:0] input_data, // 位宽根据原txt数据调整,示例为8bit // 要求保留的输出端口 output reg [7:0] Y_Planar_output, output reg [7:0] Cb_Planar_output, output reg [7:0] Cr_Planar_output, output reg [7:0] Y_DC_output_corner, output reg [7:0] Y_DC_output_left, output reg [7:0] Y_DC_output_top, output reg output_valid // 可选:标识输出有效 ); // 替换$readmemh的输入缓冲区,大小匹配原txt文件的数据总量 localparam BUF_SIZE = 1024; // 示例值,需替换为实际数据量 reg [7:0] input_buf[0:BUF_SIZE-1]; reg [9:0] addr_cnt; // 地址计数器位宽根据BUF_SIZE调整 // 数据加载时序逻辑 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin addr_cnt <= 'd0; end else if (data_valid && addr_cnt < BUF_SIZE) begin input_buf[addr_cnt] <= input_data; addr_cnt <= addr_cnt + 1'b1; end end // 保留原HEVC核心处理逻辑,将原从$readmemh获取的数据改为从input_buf读取 // -------------------------- // 原模块的HEVC相关运算逻辑 // ... 此处放置原模块的核心代码 // -------------------------- // 输出赋值逻辑(根据原模块逻辑调整时序) always @(posedge clk or negedge rst_n) begin if (!rst_n) begin Y_Planar_output <= 'd0; Cb_Planar_output <= 'd0; Cr_Planar_output <= 'd0; Y_DC_output_corner <= 'd0; Y_DC_output_left <= 'd0; Y_DC_output_top <= 'd0; output_valid <= 1'b0; end else begin // 根据核心处理结果赋值输出 // ... 此处补充原模块的输出赋值逻辑 output_valid <= (addr_cnt == BUF_SIZE) ? 1'b1 : 1'b0; // 示例:数据加载完成后输出有效 end end endmodule
3. 顶层模块例化
为满足Cadence综合的顶层模块要求,编写顶层模块例化改造后的核心模块:
module hevc_top ( input clk, input rst_n, input data_valid, input [7:0] input_data, output [7:0] Y_Planar_output, output [7:0] Cb_Planar_output, output [7:0] Cr_Planar_output, output [7:0] Y_DC_output_corner, output [7:0] Y_DC_output_left, output [7:0] Y_DC_output_top, output output_valid ); // 例化核心模块 hevc_core u_hevc_core ( .clk (clk), .rst_n (rst_n), .data_valid (data_valid), .input_data (input_data), .Y_Planar_output (Y_Planar_output), .Cb_Planar_output (Cb_Planar_output), .Cr_Planar_output (Cr_Planar_output), .Y_DC_output_corner (Y_DC_output_corner), .Y_DC_output_left (Y_DC_output_left), .Y_DC_output_top (Y_DC_output_top), .output_valid (output_valid) ); endmodule
4. Cadence综合流程(以Genus为例)
步骤1:准备工作
- 导入改造后的
hevc_core.v和hevc_top.v文件 - 加载目标工艺库(无需FPGA库,选择标准ASIC工艺库即可)
步骤2:设置综合约束
在Genus TCL控制台输入约束命令:
# 设置时钟约束(示例周期10ns,频率100MHz) create_clock -name clk -period 10 [get_ports clk] # 设置复位约束(若使用rst_n) set_reset_assignment -low true -input rst_n # 设置输入信号切换率(用于功耗计算) set_switching_activity -input data_valid 0.5 set_switching_activity -input input_data 0.3
步骤3:执行综合
# 指定顶层模块 set top hevc_top # 执行综合 compile_ultra -gate_clock -no_autoungroup -compile_instance [get_designs $top]
步骤4:生成报告
# 生成面积报告 report_area -hierarchy > hevc_area_report.rpt # 生成功耗报告 report_power -hierarchy -analysis_effort high > hevc_power_report.rpt
5. 关键注意事项
- 必须删除原模块中所有不可综合语句(如
$readmemh、$display等),仅保留组合/时序逻辑 - 输入缓冲区大小和地址计数器位宽必须与原txt文件的数据总量匹配
- 若无需实际输入数据验证,综合时工具会自动处理未约束的输入端口,不影响面积/功耗报告生成
- 功耗报告的准确性依赖输入信号切换率的设置,可根据实际场景调整参数
内容的提问来源于stack exchange,提问作者Sunil.B
相关产品推荐
相关产品推荐

