第一部分基本问答基本知识:问题一:VerilogHDL是在哪一年首次被IEEE标准化的?回答:1983年首次提出,1995年被IEEE标准化。问题二:VerilogHDL支持哪三种基本描述方式?回答:行为描述方式(过程化结构建模),数据流方式(连续赋值语句方式),结构化方式(使用门和模块实例语句描述建模)。问题三:VerilogHDL中的两类主要数据类型是什么?回答:线网数据类型wire型和寄存器数据类型reg型。问题四:UDP代表什么?回答:用户定义原语,既可以是组合逻辑原语,也可以是时序逻辑原语。问题五:开关级基本门和基本逻辑门?回答:pmos和nmos等为开关级基本门,and、or和nand等为基本逻辑门。问题六:系统任务和系统函数的第一个字符标识符是什么?回答:$是系统任务和系统函数的字符标识符;问题七:VerilogHDL中是否有布尔类型?回答:有等效于布尔类型的,例如wireBIT;而且还有按位与,按位或等运算符;问题八:文本替换编译指令?`defineBIT32`undefBIT问题九:线网类型变量说明后未赋值,其缺省值为多少?回答:线网类型缺省值为z,寄存器类型缺省值为x;问题十:VerilogHDL允许没有显式说明的线网类型,此时怎样决定线网类型?回答:没有显式说明的线网类型取缺省为1位线网;问题十一:integer[0:3]Ripple;该说明错在哪里?回答:可以改成integerRipple;或integerRipple[0:3];前者定义一个整数型寄存器,后者定义一组4个整数型寄存器;问题十二:编写系统任务从数据文件”MEMA.DATA”加载32X64字存储器?reg[0:63]Mem[0:31];$readmemh(“MEMA.DATA”,Mem);问题十三:在编译时覆盖参数值的两种方法?回答:使用参数定义语句parameter或者在模块初始化语句中定义参数;问题十四:用移位操作符给2X4解码器建模?`timescale1ns/1nsmoduleDecoder(A,B,DecodeOut);inputA,B;output[0:3]DecodeOut;assignDecodeOut=4’b1{A,B};endmodule问题十五:为什么有了if语句还要?:语句呢?回答:if语句只能用于always模块中,在assign中就用?:语句,而且某些时候后者更简洁灵活。问题十六:如果case条件表达式和分支项表达式的长度不同会怎样?回答:在这种情况下,在进行任何比较前,所有的case表达式都统一为这些表达式的最长长度;而且case语句中x表示不确定值,z和?表示无关值;问题十七:顺序语句块和并行语句块的区别,顺序语句块能否出现在并行语句块中?回答:顺序语句块中的语句按顺序执行,并行语句块中语句按并行执行,这两者可以混合使用,可以相互出现在对方的语句块中;问题十八:语句块在什么时候需要标识符?回答:语句块的标识符是可选的,如果有标识符,寄存器变量可以在语句块内部声明,带标识符的语句块可被引用,语句块标识符提供唯一标识寄存器的一种方式,寄存器是静态的,它们的值在整个模拟运行中不变;问题十九:用一个initial语句和一个forever语句替代下面的always语句?always@(ExpectedorObserved)if(Expected!==Observed)begin$display(“MISMATCH:Expected=%b,Observed=%b”,Expected,Observed);$stop;end解答:initialbeginif(Observed!==Expected)forecer$display(“MISMATCH:Expected=%b,Observed=%b”,Expected,Observed);$stop;end问题二十:模块实例语句和门实例语句的区别?解答:门实例语句的端口定义不同的门对应有专门格式,如与门的第一个端口为输出,其他的端口为输入,模块实例语句的端口相对灵活,端口位置没有限制;模块实例语句有内部端口和外部端口之分,门实例语句没有;模块实例语句可以引用其他模块,门实例语句不能引用;问题二十一:函数和任务的区别?解答:函数,如同任务一样,也可以在模块不同位置执行共同代码。函数与任务的不同之处是函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其它的任务。此外,函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函数可以调用其它的函数。函数和任务定义中声明的局部寄存器都是静态的,在多个调用之间保持它们的值;模块是VerilogHDL的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。连续赋值(即阻塞赋值)语句的语法为:assign[delay]LHS_net=RHS_expression;右边表达式使用的操作数无论何时发生变化,右边表达式都重新计算,并且在指定的时延后变化值被赋予左边表达式的线网变量,时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间,如果没有定义时延值,缺省为0。实例一:2X4解码器。实例一是数据流描述方式,即采用连续赋值语句。`timescale1ns/1nsmoduleDecoder2x4(A,B,EN,Z);inputA,B,EN;output[0:3]Z;wireAbar,Bbar;assign#1Abar=~A;assign#1Bbar=~B;assign#2Z[0]=~(Abar&Bbar&EN);assign#2Z[1]=~(Abar&B&EN);assign#2Z[2]=~(A&Bbar&EN);assign#2Z[3]=~(A&B&EN);endmodule注释:以反引号`开始的第一条语句是编译器指令,编译器指令`timescale将模块中所有时延的单位设置为1ns,时间精度为1ns,模块Decoder2x4有三个输入端口和一个4位输出端口,线网类型说明了两个连线型变量Abar和Bbar,模块包含6个连续赋值语句。参见图2-3中的波形图。当EN在第5ns变化时,语句3、4、5和6执行。这是因为EN是这些连续赋值语句中右边表达式的操作数。Z[0]在第7ns时被赋予新值0。当A在第15ns变化时,语句1、5和6执行。执行语句5和6不影响Z[0]和Z[1]的取值。执行语句5导致Z[2]值在第17ns变为0。执行语句1导致Abar在第16ns被重新赋值。由于Abar的改变,反过来又导致Z[0]值在第18ns变为1。请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式是隐式而非显式的建模方式。此外,连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。实例二:1位全加器。实例二是行为描述方式,即采用过程语句结构描述,always语句总是循环重复执行。moduleFA_Seq(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regSum,Cout;regT1,T2,T3;always@(AorBorCin)beginSum=(A^B)^Cin;T1=A&Cin;T2=B&Cin;T3=A&B;Cout=(T1|T2)|T3;endendmodule注释:模块FA_Seq有三个输入和两个输出,由于Sum和Cout和T1和T2和T3在always语句中被赋值,他们被说明为reg类型,always语句中有一个与事件控制(跟在@后面的表达式)相关联的顺序过程(begin-end对),只要A、B或Cin之一的值发生变化,顺序过程就执行,顺序过程中的语句顺序执行,顺序过程执行结束之后被挂起,always语句再次等待触发事件。实例三:initial语句。实例三也是行为描述方式,采用initial语句,只执行一次。`timescale1ns/1nsmoduleTest(Pop,Pid);outputPop,Pid;regPop,Pid;initialbeginPop=0;Pid=0;Pop=#51;Pid=#31;Pop=#60;Pid=#20;endendmodule注释:initial语句包含一个顺序过程,这一顺序过程在0ns时开始执行,所有语句全部执行完毕后,initial语句永远挂起,顺序过程中包含定义语句内时延的分组过程赋值的实例,只有寄存器类型数据reg型能够在这两种语句(initial语句和always语句)中被赋值,所有初始化语句和always语句在0时刻并发执行。实例四:用内置门原语描述1位全加器,即结构化描述方式。在VerilogHDL中可用如下方式描述结构:内置门原语,开关级原语,用户定义原语,模块实例;通过使用线网来相互连接。moduleFA_Str(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;wireS1,T1,T2,T3;xorX1(S1,A,B);X2(Sum,S1,Cin);andA1(T3,A,B);A2(T2,B,Cin);A3(T1,A,Cin);orO1(Cout,T1,T2,T3);endmodule注释:在该实例中,模块包含门的实例语句,也就是说包含内置门xor、and、or的实例语句(在这种表达方式中,将内置门看成是已经存在的实例),门实例由线网类型变量S1,T1,T2,T3互连,由于没有指定的顺序,门实例语句可以以任何顺序出现,xor、and、or是内置门原语,X1,X2,A1,A2,A3,O1是实例名称,紧跟在每个门后的信号列表是它的互连,列表中第一个是门输出,余下的是输入。实例五:由4个1位全加器构成一个4位全加器,采用结构描述形式。moduleFourBitFA(FA,FB,FCin,FSum,FCout);parameterSIZE=4;input[SIZE:1]FA,FB;output[SIZE:1]FSum;inputFCin;outputFCout;wire[1:SIZE-1]FTemp;FA_StrFA1(.A(FA[1]),.B(FB[1]),.Cin(FCin),.Sum(FSum[1]),.Cout(FTemp[1])),FA2(.A(FA[2]),.B(FB[2]),.Cin(FTemp[1]),.Sum(FSum[2]),.Cout(FTemp[2])),FA3(FA[3],FB[3],FTemp[2],FSum[3],FTemp[3]),FA4(FA[4],FB[4],FTemp[3],FSum[4],FCout);endmodule注释:在这一实例中,模块实例用于建模4位全加器,在模块实例语句中,端口可以与名称或位置关联;前两个实例FA1,FA2使用名称关联方式,也就是说,端口的名称和它连接的线网被显式描述(每一个的形式都为.port_name(net_name));后两个实例语句,实例FA3,FA4使用位置关联方式将端口与线网关联,关联顺序很重要(FA[4]与FA_Str端口A连接,FB[4]与FA_Str的端口B连接,余下的由此类推),临时变量FTemp定义成wire类型。注意在FA1,FA2,FA3语句的最后使用的是,号,而不是;号,只有在最后FA4语句的结尾采用;号。实例六:混合设计描述方式。在模块中,结构的和行为的可以自由混合,也就是说,模块描述中可以包含实例化的门,模块实例化语句,连续赋值语句,always和initial语句(只有reg型数据可以在这两种语句中赋值);always和initial语句的值可以驱动门或开关,连续赋值语句(assign语句)的值只能驱动线网,而来自门或连续赋值语句的值可以反过来用于触发always和initial语句。moduleFA_Mix(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regCout;regT1,T2,T3;wireS1;xorX1(S1,A,B);//门实例语句al