说是新写法,其实也不新了。说来惭愧,我也是最近听了一节阿东的公开课,才知道Verilog有95语法和01语法之分,关于这一点其实软件是可以设置的,如下图。

新版的都是默认01语法,当然它是向下兼容的,写成95的形式,编译是不会报错的。
一开始学FPGA的时候,我都是这么些的,
moduleled
(
CLK,RSTn,LED
);
inputCLK;
inputRSTn;
output[3:0]LED
reg[3:0]rLED;
//-------------------------------------------
always@(posedgeCLKornegedge)
if(!RSTn)rLED<=4’b0001;
elserLED={rLED[0],rLED[2:0]};
assignLED<=rLED;
后来学聪明了一点,就这么写
moduleled
(
inputCLK,
inputRSTn,
outputreg[3:0]LED
);
always@(posedgeCLKornegedgeRSTn)
if(!RSTn)LED<=4’b0001;
elserLED={LED[0],LED[2:0]};
感觉第二种,简单很多,立马爱上第二种。(其实第一种就是95写法,第二种就是01的写法)。
后来买了一块开发板,惊奇的发现,开发板上没有RC复位电路,如下图:

这样RSTn这个引脚没地方分配了,搞的我很郁闷,因为这样一来我不好赋初值,例如if(!RSTn)LED<=4’b0001;
但是,我再次惊奇的发现,即使我没分配RSTn这个引脚RSTn,if(!RSTn)LED<=4’b0001这句话居然是有效的。似乎编译器明白你的想法。
再后来我发现了一种更牛逼的写法:
moduleled
(
inputCLK,
outputreg[3:0]LED=4’d1110
);
always@(posedgeCLK)
LED={LED[0],LED[2:0]};
看到这种写法,我十分开心,也豁然开朗,这样也可以啊!直接不要RSTn,怪不得现在有的开发板连时钟复位电路也省了。
结果,却比较失望,流水灯流不起来。复位时的值表现出来是并不是1110,而是0000,但是仿真的值却是对的。

这让我很不明白,后来却而求其次写成了这样:
moduleled
(
inputCLK,
outputreg[3:0]LED
);
reg[3:0]rLED=4’d1110; //声明寄存器的时候就可以赋值了,这非常好。
always@(posedgeCLK)
rLED={rLED[0],rLED[2:0]};
assignLED<=rLED;
这样结果就是没问的~~
我不知道,这样赋值为什么结果不正确,希望哪位大神能告知,感激不尽~~
moduleled
(
inputCLK,
outputreg[3:0]LED=4’d1110
);
//---------------------2013-12-09----------------------------
跟Craftor以及CrazyBingo询问了下
总结如下:
output reg[3:0] LED = 4’d1110//这种就是仿真用的,无法初始化值
reg[3:0] LED = 4’d1110;//声明寄存器赋值时是有效的,可以初始化值
两者不要混了,就行。