资源描述:
《verilog:语法练习实例》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第八讲参见错误分析语法练习设计实例使用非Verilog表达方式例1integeri;for(i=0;i<8;i++)begin……end出现了非法的自增算符“i++”,这是熟悉C语言编程者最易犯的典型错误.类似的错误包括自减算符“--”将i++改写为i=i+1例2initialbegina=0,b=0,c=0;#10a=1,b=1;#10a=0,c=1;……endVerilogHDL以分号作为语句的结束符设计时会不经意中用逗号代替,从而产生错误将逗号改写为分号与类型说明相关的错误例3moduletest_for_mux;Muxst
2、rmux_beh(out,a,b,s);initialbegin$monitor($time,“a=%bb=%bs=%bout=%b”,a,b,s,out);a=0;b=1;s=0;#10a=1;#10s=1;#10b=0;#10$finish;endendmodulemodulemux_beh(out,a,b,sel);outputout;inputa,b,sel;assignout=(sel==0)?a:b;Endmodule例3错误分析1在对MUX的行为描述中,因为涉及到的都是一位的连线型量,因而类型说明可以被缺省。2在测试
3、模块中,激励信号在initial过程块中被过程语句所赋值,因而都必须是寄存器型的量,不能被缺省3修改方法:在测试模块中增加对激励信号a,b,s的寄存器类型说明语句rega,b,s;遗漏寄存器类量的类型说明在VerilogHDL模块描述内部,如果一个量被过程赋值语句所赋值,那么在模块的数据类型说明部分,必须能够找到它的寄存器类的类型说明语句如果一个量被assign连续赋值语句所赋值,则这个量必须是连线型的例4moduletest_adder;reg[7:0]a,b;adderadd(a,b,sum);initialbegin$mon
4、itor($time,“a=%bb=%bsum=%b”,a,b,sum);a=0;b=0;#100a=1;b=1;……#100$finish;endendmodulemoduleadder(sum,a,b);output[8:0]sum;input[7:0]a,b;assignsum=a+b;Endmodule例4错误分析在对测试模块进行编译时,a、b信号通过显式说明可以知道它们的类型与线宽,但sum找不到相应的类型说明与位宽说明,因而被看作是缺省的一位宽的连线,这与实际的9位线宽的连线发生矛盾。?修改方法:?在测试模块中增加对s
5、um的线宽说明?wire[8:0]sum;与always过程语句相关的错误例5modulemux(out,a,b,select);outputout;inputa,b,select;case(select)1’b0:out=a;1’b1:out=b;endcaseendmodule例6modulemux(out,a,b,select);outputout;inputa,b,select;alwayscase(select)1’b0:out=a;1’b1:out=b;endcaseendmodule例7modulemux(out,a
6、,b,select);outputout;inputa,b,select;always@(select)case(select)1’b0:out=a;1’b1:out=b;endcaseendmodule例8(正确)modulemux(out,a,b,select);outputout;inputa,b,select;regout;always@(aorborselect)case(select)1’b0:out=a;1’b1:out=b;endcaseendmodule由零延时引起的模拟错误例9modulecomparator(
7、out,in1,in2);output[1:0]out;input[7:0]in1,in2;reg[1:0]out;alwaysbeginif(in1==in2)out=2’b00;elseif(in1>in2)out=2’b01;elseout=2’b10;endinitial#10$finish;endmodule例9错误分析?该模块用于模拟时,出现类似死机的现象?always过程语句中没有事件控制敏感表,因而循环条件始终成立?条件语句内部的赋值语句中都不存在延时说明,因而整个循环体的执行始终停留在0时刻进行改错`timesc
8、ale1ns/10ns`include"adder4.v"moduleadder_tp;wire[3:0]a,b;regcin;reg[3:0]sum;regcout;integeri,j;adder4adder(sum,cout,a,b,cin)