我想弄清楚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
端口;我不知道为什么它会报告这个。
如果我的想法是错误的,请告诉我正确的做法。
我想知道
是否可以合成integer
是的,许多综合工具都支持您使用
integer
的方式(作为 for
循环迭代器)。
我无法解释您收到的有关
Data_in
的具体警告消息,因为它看起来可以正确驱动负载。但是,我看到一些有问题的代码。
您应该运行模拟以确保设计按照您期望的方式工作。检查模块输出以确保它提供正确的输出。
for
循环很难理解。模拟器和综合工具“展开”循环,并且您有多个非阻塞作业,这通常不是一个好的编码实践。例如,这行代码在每个posedge Clock
(启用时)上执行 32 次:
crcfb <=CRC_Reg[9];
循环中的其他 9 个分配也是如此。