[工学]北大数字集成电路课件--22_Verilog的编写风格

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第22章CodingStylesforSynthesis1.if语句和case语句的编码风格2.if语句和case语句中晚到达信号的处理3.逻辑块的编码风格4.高性能编码技术5.其它问题主要内容:if语句modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[1])z=b;elseif(sel[0])z=a;elsez=0;endendmodulemodulemult_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginz=0;if(sel[0])z=a;if(sel[1])z=b;if(sel[2])z=c;if(sel[3])z=d;endendmodule例1.1a单个if语句例1.1b多重if语句注意代码的优先级if语句case语句modulecase1(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)begincasex(sel)4’b1xxx:z=d;4’bx1xx:z=c;4’bxx1x:z=b;4’bxxx1:z=a;default:z=1’b0;endcaseendendmodulecasex具有使用无关项的优点,不用列出sel的所有组合。例1.2case语句晚到达信号处理设计时通常知道哪一个信号到达的时间要晚一些。这些信息可用于构造HDL,使到达晚的信号离输出近一些。下面的例子中,针对晚到达信号重新构造if和case语句,以提高逻辑性能。晚到达的是数据信号顺序if语句可以根据关键信号构造HDL。在例1.1a中,输入信号d处于选择链的最后一级,也就是说d最靠近输出。假如信号b_is_late是晚到达信号,我们就要重新构造例1.1a使其最优化。modulemult_if_improved(a,b_is_late,c,d,sel,z);inputa,b_is_late,c,d;input[3:0]sel;outputz;regz,z1;always@(aorb_is_lateorcordorsel)beginz1=0;if(sel[0])z1=a;if(sel[2])z1=c;if(sel[3])z1=d;if(sel[1]&~(sel[2]|sel[3]))z=b_is_late;elsez=z1;endendmodule具有优先级的if结构modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[1])z=b_is_late;elseif(sel[2])z=c;elseif(sel[3])z=d;elseif(sel[0])z=a;elsez=0;endendmodule无优先级的if结构晚到达的是数据信号晚到达的是控制信号如果晚到达信号作为if语句条件分支的条件,也应使这个信号离输出最近。在下面的例子中,CTRL_is_late是晚到达的控制信号modulesingle_if_late(A,C,CTRL_is_late,Z);input[6:1]A;input[5:1]C;inputCTRL_is_late;outputZ;regZ;always@(CorAorCTRL_is_late)if(C[1]==1’b1)Z=A[1];elseif(C[2]==1’b0)Z=A[2];elseif(C[3]==1’b1)Z=A[3];elseif(C[4]==1’b1&&CTRL_is_late==1’b0)//latearrivingsignalinifconditionZ=A[4];elseif(C[5]==1’b0)Z=A[5];elseZ=A[6];endmodule晚到达的是控制信号modulesingle_if_late(A,C,CTRL_is_late,Z);input[6:1]A;input[5:1]C;inputCTRL_is_late;outputZ;regZ;always@(CorAorCTRL_is_late)//latearrivingsignalinifconditionif(C[4]==1’b1&&CTRL_is_late==1’b0)Z=A[4];elseif(C[1]==1’b1)Z=A[1];elseif(C[2]==1’b0)Z=A[2];elseif(C[3]==1’b1)Z=A[3];elseif(C[5]==1’b0)Z=A[5];elseZ=A[6];endmoduleif-case嵌套语句modulecase_in_if_01(A,DATA_is_late_arriving,C,sel,Z);input[8:1]A;inputDATA_is_late_arriving;input[2:0]sel;input[5:1]C;outputZ;regZ;always@(selorCorAorDATA_is_late_arriving)if(C[1])Z=A[5];elseif(C[2]==1’b0)Z=A[4];elseif(C[3])Z=A[1];elseif(C[4])case(sel)3’b010:Z=A[8];3’b011:Z=DATA_is_late_arriving;3’b101:Z=A[7];3’b110:Z=A[6];default:Z=A[2];endcaseelseif(C[5]==1’b0)Z=A[2];elseZ=A[3];endmoduleif-case嵌套语句Case语句if语句if-case嵌套语句—修改后always@(selorCorAorDATA_is_late_arriving)beginif(C[1])Z1=A[5];elseif(C[2]==1’b0)Z1=A[4];elseif(C[3])Z1=A[1];elseif(C[4])case(sel)3’b010:Z1=A[8];//3’b011:Z1=DATA_is_late_arriving;3’b101:Z1=A[7];3’b110:Z1=A[6];default:Z1=A[2];endcaseelseif(C[5]==1’b0)Z1=A[2];elseZ1=A[3];FIRST_IF=(C[1]==1’b1)||(C[2]==1’b0)||(C[3]==1’b1);if(!FIRST_IF&&C[4]&&(sel==3’b011))Z=DATA_is_late_arriving;elseZ=Z1;endif-case嵌套语句—修改后逻辑构造块的编码格式下面介绍某些常用逻辑块,如译码器的不同的编码格式。每种块给出了一个通常格式和建议格式。所有的例子的位宽都是参数化的。3-8译码器index方式moduledecoder_index(in1,out1);parameterN=8;parameterlog2N=3;input[log2N-1:0]in1;output[N-1:0]out1;reg[N-1:0]out1;always@(in1)beginout1=0;out1[in1]=1’b1;endendmoduleloop方式moduledecoder38_loop(in1,out1);parameterN=8;parameterlog2N=3;input[log2N-1:0]in1;output[N-1:0]out1;reg[N-1:0]out1;integeri;always@(in1)beginfor(i=0;iN;i=i+1)out1[i]=(in1==i);endendmodule译码器优先级编码器—高位优先1???_????:11101??_????:110001?_????:1010001_????:1000000_1???:0110000_01??:0100000_001?:0010000_000?:000modulepriority_low_high(A,P);parameterN=8;parameterlog2N=3;input[N-1:0]A;//InputVectoroutput[log2N-1:0]P;//HighPriorityIndexreg[log2N-1:0]P;function[log2N-1:0]priority;input[N-1:0]A;integerI;beginpriority=3’b0;for(I=0;IN;I=I+1)if(A[I])priority=I;//Overridepreviousindexendendfunctionalways@(A)P=priority(A);endmodule线性结构描述优先级编码器线性结构树形结构归约XORmoduleXOR_reduce(data_in,data_out);parameterN=5;input[N-1:0]data_in;outputdata_out;regdata_out;functionXOR_reduce_func;input[N-1:0]data;integerI;beginXOR_reduce_func=0;for(I=N-1;I=0;I=I-1)XOR_reduce_func=XOR_reduce_func^data[I];endendfunctionalways@(data_in)data_out=XOR_reduce_func(data_in);endmodule线性结构归约XOR线性结构树形结构归约XORmoduleXOR_tree(data_in,data_out);parameterN=5;parameterlogN=3;input[N-1:0]data_in;outputdata_out;regdata_out;functioneven;input[31:0]num;even=~num[0];endfunctionfunctionXOR_tree_func;input[N-1:0]data;integerI,J,K,NUM;reg[N-1:0]temp,result;begintemp[N-1:0]=data_in[N-1:0];NUM=N;for(K=logN-1;K=0;K=K-1)beginJ=(NUM+1)/2;J=J-1;if(even(NUM))for(I=NUM-1;I=0;I=I-2)beginresult[J]=temp[I]^temp[I-1];J=J-1;endelsebeginfor(I=NUM-1;I=1;I=I-2)beginresult[J]=temp[I]^temp[I-1];J=J-1;endresult[0]=temp[0];endtemp[N-1:0]=result[N-1:0];NUM=(NUM+1)/2;endXOR_tree_func=result[0];endendfunctionalways@(data_in)data_out=XOR_tree_func(data_in);endendmodule树形结构高性能编码技术在某些情况下,可以通过重复逻辑来提高速度。在下面的例子中,CONTROL是一个晚到达的输入信号。要提高性能,就要减少CONTROL到输出之间的逻辑。moduleBEFORE(ADDRESS,PTR1,PTR2,B,CONTROL,COUNT);input[7:0]PTR1,PTR2;input[15:0]ADDRESS,B;inputCONTROL;//

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功