如何知道verilog代码是否可以合成?

问题描述 投票:0回答:1

我想弄清楚Verilog语法是否可以通过实践来综合。 RTL代码如下所示:

module CRC10 (Clock, Data_In, CRC_En, CRC_Clr, CRC_Out);
input Clock;
input CRC_En;
input CRC_Clr;
output [9:0] CRC_Out;
//reg [9:0] CRC_Out;
input [31:0] Data_In;

reg CRC_En_reg;
reg CRC_Clr_reg;
reg [31:0] Data_In_reg;

always @ (posedge Clock)
begin
CRC_En_reg = CRC_En ;
CRC_Clr_reg = CRC_Clr ;
Data_In_reg = Data_In ;
end

reg crcfb;
reg [9:0] CRC_Reg;
integer i;

assign CRC_Out = CRC_Reg;

always @ (posedge Clock)
begin
    if (CRC_Clr_reg)
        CRC_Reg <= 0;
    else if (CRC_En_reg) 
    begin
        for (i=31;i>=0;i=i-1)
        begin
                   crcfb     <=CRC_Reg[9];
                   CRC_Reg[9]<=CRC_Reg[8]^crcfb;
                   CRC_Reg[8]<=CRC_Reg[7];
                   CRC_Reg[7]<=CRC_Reg[6];
                   CRC_Reg[6]<=CRC_Reg[5];
                   CRC_Reg[5]<=CRC_Reg[4]^crcfb;
                   CRC_Reg[4]<=CRC_Reg[3]^crcfb;
                   CRC_Reg[3]<=CRC_Reg[2];
                   CRC_Reg[2]<=CRC_Reg[1];
                   CRC_Reg[1]<=CRC_Reg[0]^crcfb;
                   CRC_Reg[0]<=Data_In_reg[i]^crcfb;
        end
    end
end
endmodule

我想知道

integer
是否可以合成,所以我做了一个简单的设计编译项目。文件目录如下所示。

以下代码为CRC10.sdc:

create_clock -name clk  -period 30.0   [get_ports  Clock]

set_dont_touch_network      [all_clocks]
set_fix_hold                [all_clocks]
set_clock_uncertainty  0.1  [all_clocks]
set_clock_latency      0.5  [all_clocks]
set_ideal_network           [get_ports clk]



#Don't touch the basic env setting as below
set_input_delay  5.0   -clock clk [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay 0.5    -clock clk [all_outputs]

set_load         1   [all_outputs]
set_drive        1   [all_inputs]

set_operating_conditions -max_library slow -max slow
set_wire_load_model -name tsmc13_wl10 -library slow
set_max_fanout 20 [all_inputs]

以下代码为CRC10.tcl:

source .synopsys_dc.setup
read_verilog CRC10.v
link
source CRC10.sdc
set_fix_multiple_port_nets -all -buffer_constants [get_designs *] 
set verilogout_no_tri     true 

compile -inc

report_timing  -delay_type max >> setup_timing_max.txt;     #set up time
report_timing  -delay_type min >> setup_timing_min.txt;     #hold time 
report_area >> area.txt

write -hierarchy -format verilog -output  CRC10_syn.v
write_sdf -version 2.1 -context verilog  CRC10_syn.sdf
write -hierarchy -format ddc -output CRC10_syn.ddc

但是,我没有看到任何关于合成的错误或警告,所以我仍然不确定

integer
是否可以合成。

设计编译报告以下警告:

Data_In
端口是
input
端口;我不知道为什么它会报告这个。

如果我的想法是错误的,请告诉我正确的做法。

verilog synthesis
1个回答
0
投票

我想知道

integer
是否可以合成

是的,许多综合工具都支持您使用

integer
的方式(作为
for
循环迭代器)。

我无法解释您收到的有关

Data_in
的具体警告消息,因为它看起来可以正确驱动负载。但是,我看到一些有问题的代码。

您应该运行模拟以确保设计按照您期望的方式工作。检查模块输出以确保它提供正确的输出。

for
循环很难理解。模拟器和综合工具“展开”循环,并且您有多个非阻塞作业,这通常不是一个好的编码实践。例如,这行代码在每个
posedge Clock
(启用时)上执行 32 次:

               crcfb     <=CRC_Reg[9];

循环中的其他 9 个分配也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.