if else, begin の場所の話

http://japanese.sugawara-systems.com/systemverilog/verilog_faqs.htm

else 文は、最も最近のif とペアになります

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

vhdlにはelsifがあるけど、 verilogはelsifがない。else if はelsifとは同じじゃない。