13.よくあるエラー
・手続き代入文でreg宣言されていない。
always やinitial文での左辺値は、reg宣言がされていないといけない。
wire a;
always begin
a=1;=> aは、wire宣言されているのでNGです。
end
module test;
output [3:0] a;
always @(posedge clock) a<=1'b1;// reg [3:0] a;宣言がない。output[3:0] aではregの代わりにはならない。
endmodule
・begin endを忘れている
function func;
input a;
reg b;
b=a;
func=b;この二つは複文なのでbegin endで囲まないといけない。
endfunction
・;を忘れている
input a //;がない
input b;
・'と ‘の違い
`define a=3'b100 //OK
'define a=3`b100 //NG both wrong
・マクロの展開は文字列の置き換えであることを忘れている
`define a_pulas_b(a,b) a+b // (a+b)が正解
a_pulas_b(a,b)*c => a+b*cになってしまう。
・継続代入文の左辺にreg
reg a;
assign a=1; // reg宣言したaは継続代入文のの左辺におけない。
・ビットVectorでの接続で宣言がない
test test1(w1,w2);// たとえば、wire [3:0] w1; wire[3:0] w2;の宣言を忘れている。宣言がないと1ビットの接続とみなされる。
・連接演算子でビット幅指定がない
{10,2’b00、’b100}
// 10は暗黙的に32ビットと解釈される場合もあるが、多くのシミュレータではNG、'b100もビット幅の明示指定がないのでNG
・連接演算子の連接
{3{2'b00} //NG
{{3{2'b00}}} //とする。
・@( a || b) =>NG
@(a or b) ,もしくは、@(a,b)とする。
・if 文のネスト if 文のelse
if (a)
else if(b)
if(c)
else d //このelseはどのif文に帰属?=>最近接のif文に帰属するが、紛らわしいのはbeign end にすること。
・モジュールインスタンス名を忘れている。
module test_bench;
test (w1,w2); // => test test1(w1,w2);
endmodule