Verilog HDL F.A.Q.s (Frequently Ask Questions)
if (a >= 5)
if (a <= 10)
$display ("Hello Veritak!");
else
$display ("Hello Veritak!") ;
は、正しい解釈ではありません。Verilog HDLには、elseif というレキサ(単語の認識)はなく、あるのは、if
とelse だけです。
else 文は、最も最近のif とペアになります。下記が正しい解釈です。
if (a >= 5)
if (a <= 10)
$display ("Hello Veritak!");
else
$display ("Hello Veritak!") ;
ですから、
always @(negedge reset_n or posedge clk ) begin
if(~reset_n)
s_reg <= 8'h00;
else if (rio)
if (adr_hit )
s_reg <= 8'h01;
else if (wt_pls)
if (d )
s_reg <= 8'h01;
else
s_reg <= 8'h02;
end
と書いても、コンパイラの解釈は、下のようになります。
always @(negedge reset_n or posedge clk ) begin
if(~reset_n)
s_reg <= 8'h00;
else if (rio)
if (adr_hit )
s_reg <= 8'h01;
else if (wt_pls)
if (d )
s_reg <= 8'h01;
else
s_reg <= 8'h02;
end
意図したように動かすには、begin -end を適切に挿入するしかありません。
always @(negedge reset_n or posedge clk ) begin
if(~reset_n) s_reg <= 8'h00;
else if (rio) begin
if (adr_hit ) s_reg <= 8'h01;
end
else if (wt_pls) begin
if (d ) s_reg <= 8'h01;
end else s_reg <= 8'h02;
end
この問題は、C言語に由来し構文解釈的にはShift-Reduce問題として知られています。元々C言語は、構文解釈的には、曖昧な言語でして、大半のCに由来する言語も同じ動きをします。また、この辺の反省でelsif
を構文で持っている言語もあります。特に、Pythonの場合、インテンド自体に構文の意味を持たせているので、曖昧な解釈自体が排除されており、このような問題が生じません。