- 1 1. ã¯ããã«
- 2 2. Verilog if-elseæã®åºæ¬æ§æ
- 3 3. if-elseæã®å¿çš
- 4 4. if-elseæãšcaseæã®éã
- 5 5. Verilog if-elseæã®ãã¹ããã©ã¯ãã£ã¹
- 6 6. ãããã質åïŒFAQïŒ
- 6.1 Q1: Verilogã®if-elseæã䜿ããšã©ãããçæãããã®ã¯ãªãïŒåé¿æ¹æ³ã¯ïŒ
- 6.2 Q2: if-elseæãšcaseæã®éãã¯ïŒã©ã¡ãã䜿ãã¹ãïŒ
- 6.3 Q3: Verilogã®if-elseæã¯åŠçé床ã«åœ±é¿ããïŒ
- 6.4 Q4: if-elseæã§ã®ä»£å ¥ã« = ãš <= ã®ã©ã¡ãã䜿ãã¹ãïŒ
- 6.5 Q5: if-elseæã®ãã¹ããæžããã«ã¯ã©ãããã°ããïŒ
- 6.6 ãŸãšã
- 7 7. ãŸãšã
1. ã¯ããã«
1-1. Verilogã®if-elseæãšã¯ïŒ
Verilogã¯ããŒããŠã§ã¢èšè¿°èšèªïŒHDLïŒã§ãããFPGAãASICãªã©ã®ããžã¿ã«åè·¯ãèšèšããéã«äœ¿çšãããŸãããã®äžã§ãif-elseæã¯ãããã°ã©ã ã®æµããæ¡ä»¶ã«ãã£ãŠåå²ãããéèŠãªæ§æã§ãã
Verilogã«ãããif-elseæã®äž»ãªçšéã¯æ¬¡ã®ãšããã§ãïŒ
- çµã¿åããåè·¯ã®æ¡ä»¶åå²
- é åºåè·¯ïŒããªãããããããªã©ïŒã®åäœå¶åŸ¡
- åçãªä¿¡å·å¶åŸ¡ïŒäŸïŒã»ã¬ã¯ã¿ãæ¡ä»¶ä»ãæŒç®ïŒ
ããšãã°ãif-elseæã䜿ãããšã§ãä¿¡å·ã®ç¶æ ã«ãã£ãŠç°ãªãåºåãçæããããšãå¯èœã«ãªããŸããããã¯ãåè·¯ã®èšèšã«ãããŠéåžžã«äŸ¿å©ã§ããã誀ã£ãäœ¿çšæ¹æ³ããããšæå³ããªãã©ããïŒã¡ã¢ãªèŠçŽ ïŒãçæãããããšããããŸãã
1-2. if-elseæãé©åã«äœ¿ããªããšçºçããåé¡
Verilogã®if-elseæãé©åã«äœ¿ããªããšã以äžã®ãããªåé¡ãçºçããå¯èœæ§ããããŸãïŒ
- äžèŠãªã©ãããçºç
- æ¡ä»¶åå²å ã§å šãŠã®æ¡ä»¶ãæç€ºçã«æå®ããªãå ŽåãåæããŒã«ãã©ããïŒã¡ã¢ãªèŠçŽ ïŒãçæããŠããŸãããšããããŸãã
- ããã¯ãæå³ããªãä¿æåäœãåŒãèµ·ãããèšèšããåè·¯ãæåŸ éãã«åäœããªãåå ãšãªããŸãã
- ã·ãã¥ã¬ãŒã·ã§ã³çµæãšåæçµæãç°ãªã
- ã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯æå³ããéãã®åäœãããŠããFPGAãASICã«å®è£ ããéã«åäœãå€ããããšããããŸãã
- ããã¯ãif-elseã®æžãæ¹ã«ãã£ãŠã¯ãåæããŒã«ã誀ã£ãæé©åãè¡ãå¯èœæ§ãããããã§ãã
- ã³ãŒãã®å¯èªæ§ãäœäž
- æ·±ããã¹ãïŒå ¥ãåïŒã«ãªã£ãif-elseæã¯å¯èªæ§ãæããåå ã«ãªããŸãã
- å¿
èŠã«å¿ããŠã
case
æã䜿çšããããšã§ã³ãŒããæŽçããããšãå¯èœã§ãã
1-3. æ¬èšäºã®ç®ç
æ¬èšäºã§ã¯ãVerilogã«ãããif-elseæã®åºæ¬æ§æããå¿çšäŸããã¹ããã©ã¯ãã£ã¹ãcaseæãšã®äœ¿ãåããŸã§ã詳ãã解説ããŸãã
æ¬èšäºãèªãããšã§ã以äžã®ç¥èãåŸãããŸãïŒ
- if-elseæã®æ£ããäœ¿ãæ¹
- ã©ãããçºçããªãVerilogã³ãŒãã®æžãæ¹
- if-elseãšcaseæã®é©åãªäœ¿ãåã
- Verilogã«ãããèšèšã®ãã¹ããã©ã¯ãã£ã¹
åå¿è ã®æ¹ã§ãçè§£ããããããã«ãå ·äœçãªãµã³ãã«ã³ãŒããçšããŠè§£èª¬ããŸãã®ã§ããã²æåŸãŸã§èªãã§ã¿ãŠãã ããã
2. Verilog if-elseæã®åºæ¬æ§æ
2-1. if-elseæã®æžãæ¹
Verilogã®if-elseæã¯ããœãããŠã§ã¢èšèªïŒCãPythonãªã©ïŒã®if-elseæãšäŒŒãŠããŸãããããŒããŠã§ã¢èšè¿°èšèªãšããŠã®ç¹æ§ ãèæ ®ããªããèšè¿°ããå¿ èŠããããŸãã
åºæ¬çãªif-elseæã®æ§æã¯ä»¥äžã®ããã«ãªããŸãã
always_comb begin
if (æ¡ä»¶)
åŠç1;
else
åŠç2;
end
ãŸããelse if
ãçšããŠè€æ°ã®æ¡ä»¶åå²ãè¡ãããšãã§ããŸãã
always_comb begin
if (æ¡ä»¶1)
åŠç1;
else if (æ¡ä»¶2)
åŠç2;
else
åŠç3;
end
ãã®æ§æã¯ãæ¡ä»¶ã«å¿ããŠç°ãªãåäœãããçµã¿åããåè·¯ã®èšèšã«é »ç¹ã«äœ¿çšãããŸãã
2-2. if-elseæã®åºæ¬çãªãµã³ãã«ã³ãŒã
ããã§ãå ·äœçãªäŸãšããŠã·ã³ãã«ãªã»ã¬ã¯ã¿åè·¯ãäœæããŠã¿ãŸãããã
äŸïŒå
¥åå€a
ã«å¿ããŠåºåy
ã®å€ã決ããåè·¯
module if_else_example(input logic a, b, output logic y);
always_comb begin
if (a == 1'b1)
y = b;
else
y = ~b;
end
endmodule
解説
a
ã1
ã®å Žåãy
ã¯b
ã®å€ããã®ãŸãŸåºåããŸããa
ã0
ã®å Žåãb
ã®å転å€ãåºåããŸãã
ãã®ããã«ãif-elseæã䜿çšãããšãæ¡ä»¶ã«å¿ããä¿¡å·ã®å¶åŸ¡ãç°¡åã«èšè¿°ã§ããŸãã
2-3. if-elseæã®åäœåç
Verilogã®if-elseæã¯ã以äžã®ããã«2ã€ã®ç°ãªãåè·¯èšèšã§äœ¿çšãããŸãã
- çµã¿åããåè·¯ïŒalways_combã䜿çšïŒ
- å ¥åä¿¡å·ã«å¿ããŠãªã¢ã«ã¿ã€ã ã«åºåãå€ããåè·¯ã
- ã©ãããçæããªããããæå³ããªãåäœãé²ãããšãã§ããã
always @(*)
ã§ã¯ãªãalways_comb
ã䜿ãã®ãæšå¥šãããã
- é åºåè·¯ïŒalways_ffã䜿çšïŒ
- ã¯ããã¯ä¿¡å·ã«å¿ããŠããŒã¿ãæŽæ°ãããåè·¯ã
- Dããªããããããã®ãããªåäœ ãããå Žåã«äœ¿çšãããã
次ã«ãããããã®if-elseæã®å ·äœçãªäœ¿ãæ¹ãèŠãŠãããŸãããã
2-4. çµã¿åããåè·¯ã«ãããif-elseæ
çµã¿åããåè·¯ã§ã¯ãå
¥åã«å¿ããŠå³åº§ã«åºåãå€ãããŸãã
ãã®ãããalways_comb
ã䜿çšããŠã©ãããçæãããªãããã«èšè¿°ããããšãéèŠã§ãã
module combination_logic(input logic a, b, output logic y);
always_comb begin
if (a == 1'b1)
y = b;
else
y = ~b;
end
endmodule
ãã®ã³ãŒãã§ã¯ãå
¥åa
ã®å€ã«å¿ããŠy
ã®åºåãå€åããŸãã
a == 1
ã®ãšãïŒy = b
a == 0
ã®ãšãïŒy = ~b
泚æç¹
always_comb
ã䜿çšããããšã§ãã©ãããçºçããªãããã«ããã- ãã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠå€ãå²ãåœãŠãããšãéèŠïŒ
else
ãçç¥ãããšã©ãããçºçããå¯èœæ§ããïŒã
2-5. é åºåè·¯ã«ãããif-elseæ
é åºåè·¯ã§ã¯ãã¯ããã¯ä¿¡å·ã«åæããŠåäœãããããalways_ff
ã䜿çšããŸãã
äŸïŒDããªãããããã
module d_flipflop(input logic clk, reset, d, output logic q);
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
endmodule
ãã®ã³ãŒãã¯ãDããªããããããã衚ããŠããŸãã
reset
ä¿¡å·ã1
ã«ãªã£ãå Žåãåºåq
ã0
ã«ãªã»ãããreset
ã0
ã§ã¯ããã¯clk
ã®ç«ã¡äžãããæ€åºãããå Žåãd
ã®å€ãq
ã«æ ŒçŽã
泚æç¹
- é åºåè·¯ã§ã¯
always_ff
ã䜿ãã®ãæšå¥šãããïŒalways @(*)
ã§ã¯ãªãïŒã <=
ïŒãã³ããããã³ã°ä»£å ¥ïŒã䜿çšããããšã§ãæå³ããªãç«¶åãé²ãã
2-6. if-elseæã®å®éã®æŽ»çšäŸ
Verilogã®if-elseæã¯ã以äžã®ãããªå Žé¢ã§å®éã«äœ¿çšãããŸãã
- LEDå¶åŸ¡
- ã¹ã€ããã®ç¶æ ã«å¿ããŠLEDãON/OFFããã
- ALUïŒç®è¡è«çãŠãããïŒ
- å ç®ã»æžç®ã»è«çæŒç®ã®å¶åŸ¡ã
- ç¶æ é·ç§»
- ã¹ããŒããã·ã³ã®èšèšïŒæ¬¡ã®ã»ã¯ã·ã§ã³ã§è©³ãã解説ïŒã
ãŸãšã
- if-elseæã¯Verilogã§æ¡ä»¶åå²ãè¡ãããã«äœ¿çšãããã
- çµã¿åããåè·¯ïŒalways_combïŒãšé åºåè·¯ïŒalways_ffïŒã§é©åã«äœ¿ãåããããšãéèŠã
- ãã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠå€ãæç€ºçã«ä»£å ¥ããªããšãã©ãããçºçããå¯èœæ§ãããã
- å ·äœçãªåè·¯èšèšã§ã¯ãif-elseã䜿ã£ãŠç¶æ ãå¶åŸ¡ããããšãå€ãã

3. if-elseæã®å¿çš
if-elseæã¯Verilogã§ã®æ¡ä»¶åå²ã®åºæ¬ã§ãããåçŽãªå¶åŸ¡ã ãã§ãªããçµã¿åããåè·¯ãé åºåè·¯ã®èšèšã«ãæŽ»çš ãããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãif-elseæã®å¿çšäŸãšããŠã4ãããå ç®åšãç¶æ é·ç§»åè·¯ïŒFSM: Finite State MachineïŒ ãªã©ã®èšèšã解説ããŸãã
3-1. çµã¿åããåè·¯ã®èšèš
çµã¿åããåè·¯ãšã¯ãå
¥åã®å€åã«å¿ããŠåºåãå³åº§ã«å€åããåè·¯ã®ããšã§ãã
çµã¿åããåè·¯ã®èšèšã§ã¯ always_comb
ã䜿çšããäžèŠãªã©ãããçæãããªãããã«æ³šæ ããå¿
èŠããããŸãã
äŸ1: 4ãããå ç®åšã®èšèš
4ãããã®2ã€ã®å
¥å (a
ãš b
) ãå ç®ãããã£ãªãŒ (cout
) ãå«ãçµæ (sum
) ãåºåããåè·¯ãäœæããŸãã
module adder(
input logic [3:0] a, b,
input logic cin,
output logic [3:0] sum,
output logic cout
);
always_comb begin
if (cin == 1'b0)
{cout, sum} = a + b; // ãã£ãªãŒãªã
else
{cout, sum} = a + b + 1; // ãã£ãªãŒãã
end
endmodule
解説
cin
ã0
ã®å Žåãa + b
ãèšç®ãcin
ã1
ã®å Žåãa + b + 1
ãèšç®ïŒãã£ãªãŒè¿œå ïŒãalways_comb
ã䜿çšããããšã§ãçµã¿åããåè·¯ãšããŠåäœããäžèŠãªã©ãããåé¿ ã§ããŸãã
3-2. é åºåè·¯ïŒã¬ãžã¹ã¿ïŒã§ã®äœ¿çš
é åºåè·¯ã¯ãã¯ããã¯ä¿¡å·ïŒclkïŒã«åæããŠããŒã¿ãæŽæ°ãããåè·¯ ã§ãã
if-elseæã掻çšããããšã§ãç¶æ
é·ç§»ãã¬ãžã¹ã¿ã®å¶åŸ¡ãã§ããŸãã
äŸ2: Dããªããããããã®èšèš
Dããªããããããã¯ãã¯ããã¯ä¿¡å·ã®ç«ã¡äžããïŒposedge clkïŒã§å
¥å d
ãåºå q
ã«æ ŒçŽããåè·¯ã§ãã
module d_flipflop(
input logic clk, reset, d,
output logic q
);
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0; // ãªã»ããæã¯0ã«ãã
else
q <= d; // ã¯ããã¯ã®ç«ã¡äžããã§dãqã«ä¿å
end
endmodule
解説
reset
ã1
ã«ãªããšãq
ã¯0
ã«ãªã»ããããããclk
ã®ç«ã¡äžããïŒposedge clkïŒã§d
ã®å€ãq
ã«ä¿åãalways_ff
ã䜿çšããããšã§ãã¬ãžã¹ã¿ïŒããªããããããïŒãšããŠåäœ ããŸãã
3-3. ç¶æ é·ç§»ïŒFSMïŒã§ã®if-elseæã®äœ¿çš
if-elseæã¯ãç¶æ
é·ç§»åè·¯ïŒFSM: Finite State MachineïŒ ã®èšèšã«ã掻çšãããŸãã
FSMã¯ãè€æ°ã®ç¶æ
ãæã¡ãæ¡ä»¶ã«å¿ããŠé·ç§»ããåè·¯ ã§ãã
äŸ3: ã·ã³ãã«ãªç¶æ é·ç§»åè·¯
ãã¿ã³ã®æŒäž (btn
) ã«å¿ããŠãLED ã®ç¶æ
(led_state
) ããã°ã«ããFSMãèšèšããŸãã
module fsm_toggle(
input logic clk, reset, btn,
output logic led_state
);
typedef enum logic {OFF, ON} state_t;
state_t state, next_state;
always_ff @(posedge clk or posedge reset) begin
if (reset)
state <= OFF; // åæç¶æ
else
state <= next_state;
end
always_comb begin
case (state)
OFF: if (btn) next_state = ON;
else next_state = OFF;
ON: if (btn) next_state = OFF;
else next_state = ON;
default: next_state = OFF;
endcase
end
assign led_state = (state == ON);
endmodule
解説
state
倿°ã§LEDã®ç¶æ ãä¿æïŒONãŸãã¯OFFïŒãreset
ã1
ã®ãšããLEDã¯OFFïŒåæç¶æ ïŒãbtn
ãæŒããããšãON â OFF ããã°ã«ã- ç¶æ é·ç§»ã«ã¯caseæãäœ¿çš ããå¯èªæ§ãåäžã
3-4. if-elseæã®å¿çšãã¯ããã¯
â ãã¹ãã®æ·±ãif-elseæãé¿ãã
if-elseæãæ·±ããªãããããšãå¯èªæ§ãäœäžãããã°ã®åå ã«ãªããŸãã
æªãäŸïŒãã¹ããæ·±ãïŒ
always_comb begin
if (a == 1) begin
if (b == 1) begin
if (c == 1) begin
y = 1;
end else begin
y = 0;
end
end else begin
y = 0;
end
end else begin
y = 0;
end
end
æ¹åäŸïŒcaseæã掻çšïŒ
always_comb begin
case ({a, b, c})
3'b111: y = 1;
default: y = 0;
endcase
end
- æ¡ä»¶ããããåã§è¡šçŸ ãã
case
æã䜿çšããããšã§ããã¹ããæžãããŠå¯èªæ§ãåäžã
ãŸãšã
- if-elseæã¯çµã¿åããåè·¯ãšé åºåè·¯ã®äž¡æ¹ã§äœ¿çšã§ããã
- çµã¿åããåè·¯ã§ã¯
always_comb
ãé åºåè·¯ã§ã¯always_ff
ã䜿çšã - ç¶æ é·ç§»åè·¯ïŒFSMïŒã§ã¯ãif-elseæãcaseæã䜿ã£ãŠç¶æ ã管çããã
- ãã¹ããæ·±ãif-elseæã¯å¯èªæ§ãæãªããããcaseæããããåãæŽ»çšããŠæ¹åããã
4. if-elseæãšcaseæã®éã
Verilogã«ã¯ãæ¡ä»¶åå²ãè¡ãããã® if-elseæ ãš caseæ ããããŸãã
ãããã¯ã©ã¡ããå¶åŸ¡æ§é ãšããŠåºã䜿çšãããŸãããããããé©ããçšéãç°ãªããããé©åã«äœ¿ãåããããšãéèŠã§ãã
4-1. caseæãšã¯ïŒ
caseæã®åºæ¬æ§æ
case
æã¯ãè€æ°ã®ç°ãªãæ¡ä»¶ã«å¿ããåŠçãèšè¿°ããããã«äœ¿çšãããŸãã
ç¹å®ã®å€ã«å¯ŸããŠãåŠçãåå²ãããå Žåã«é©ããŠããŸãã
always_comb begin
case (æ¡ä»¶å€æ°)
å€1: åŠç1;
å€2: åŠç2;
å€3: åŠç3;
default: åŠç4; // ã©ã®å€ã«ã該åœããªãå Žå
endcase
end
caseæã®ãµã³ãã«ã³ãŒã
以äžã¯ãå
¥åä¿¡å· sel
ã®å€ã«å¿ã㊠y
ã®åºåãåãæ¿ããã·ã³ãã«ãªäŸã§ãã
module case_example(input logic [1:0] sel, input logic a, b, c, d, output logic y);
always_comb begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
2'b11: y = d;
default: y = 0; // äžãäžã®ããã«defaultãçšæ
endcase
end
endmodule
解説
sel
ã®å€ã«å¿ããŠãy
ã®å€ãa, b, c, d
ã®ããããã«èšå®ãããã- è€æ°ã®åºå®å€ãæ¡ä»¶ã«åå²ãããå Žåãcaseæã䜿ããšã³ãŒããç°¡æœã«ãªãã
default
ãçšæããããšã§ãæªå®çŸ©ã®å ¥åã«å¯Ÿãã誀åäœãé²ãã
4-2. if-elseæãšcaseæã®éã
if-elseæãšcaseæã¯ãã©ã¡ããæ¡ä»¶åå²ãè¡ããŸããã以äžã®ãããªéèŠãªéãããããŸãã
æ¯èŒé ç® | if-elseæ | caseæ |
---|---|---|
é©çšå Žé¢ | æ¡ä»¶ãç¯å²çã»é£ç¶çãªå Žåã«é©çš | æ¡ä»¶ãåå¥ã®åºå®å€ã®å Žåã«é©çš |
å¯èªæ§ | ãã¹ããæ·±ããªããšå¯èªæ§ãäœäž | æ¡ä»¶ãæç¢ºã§åããããã |
ã·ã³ã»ãµã€ãºçµæ | if-else ã¯ããŒã«ã«ãã£ãŠæé©åããã | case ã¯ãã«ããã¬ã¯ãµã«å€æããããã |
ã©ããçºçã®å¯èœæ§ | æ¡ä»¶ãé©åã«åŠçããªããšã©ãããçºç | default ãèšè¿°ããªããšæªå®çŸ©åäœã«ãªã |
4-3. if-elseæãšcaseæã®äœ¿ãåã
â if-elseæã䜿ãã¹ãã±ãŒã¹
â æ¡ä»¶ãç¯å²æå®ã®å Žå
always_comb begin
if (value >= 10 && value <= 20)
output_signal = 1;
else
output_signal = 0;
end
- ç¯å² (
10~20
) ãæ¡ä»¶ã«ããå Žå㯠if-elseæãé©ããŠããã - caseæã§ã¯ç¯å²æ¡ä»¶ãèšè¿°ã§ããªãããããã®ãããªåŠçã«ã¯åããªãã
â åªå é äœãããå Žå
always_comb begin
if (x == 1)
y = 10;
else if (x == 2)
y = 20;
else if (x == 3)
y = 30;
else
y = 40;
end
- äžã®æ¡ä»¶ãæç«ãããšããã以éã®å€å®ãã¹ãããããã
- åªå é äœãã€ããŠåŠçããå Žåã«é©ããŠããã
â¡ caseæã䜿ãã¹ãã±ãŒã¹
â ç¹å®ã®å€ããšã«åŠçãåå²ããå Žå
always_comb begin
case (state)
2'b00: next_state = 2'b01;
2'b01: next_state = 2'b10;
2'b10: next_state = 2'b00;
default: next_state = 2'b00;
endcase
end
state
ã®å€ã«å¿ããŠnext_state
ãåãæ¿ããã- ç¶æ é·ç§»ïŒFSMïŒã§ã¯caseæãäžè¬çã
â æ¡ä»¶ã®çš®é¡ãå€ãå Žå
always_comb begin
case (opcode)
4'b0000: instruction = ADD;
4'b0001: instruction = SUB;
4'b0010: instruction = AND;
4'b0011: instruction = OR;
default: instruction = NOP;
endcase
end
- åœä»€ãã³ãŒãã®ããã«ãå€ãã®ç°ãªãå€ã«å¯ŸããŠåŠçãè¡ãå Žåãcaseæã®æ¹ãå¯èªæ§ãé«ãã
ãŸãšã
â
if-elseæã¯ãç¯å²æå®ãåªå
é äœã®ããåŠçã«é©ããŠãã
â
caseæã¯ãåå¥ã®å€ã«å¯Ÿå¿ããåŠçãç¶æ
é·ç§»ïŒFSMïŒã«é©ããŠãã
â
æ¡ä»¶ãå€ãå Žåã¯ãå¯èªæ§ã®èгç¹ããcaseæãæšå¥šããã
â
ã©ã¡ãã䜿ããè¿·ã£ãå Žåã¯ã”æ¡ä»¶ã®çš®é¡” ã “åªå
é äœã®æç¡” ãåºæºã«éžæãã
5. Verilog if-elseæã®ãã¹ããã©ã¯ãã£ã¹
if-elseæã¯Verilogã§åºã䜿çšãããæ¡ä»¶åå²ã®æ¹æ³ã§ãããé©åã«èšè¿°ããªããšã©ãããçºçããããæå³ããªãåäœãåŒãèµ·ãã å¯èœæ§ããããŸããæ¬ã»ã¯ã·ã§ã³ã§ã¯ãVerilogã®if-elseæãé©åã«èšè¿°ããããã® ãã¹ããã©ã¯ãã£ã¹ ã解説ããŸãã
5-1. ã©ãããé²ãããã®æžãæ¹
Verilogã§ã¯ãçµã¿åããåè·¯ãèšè¿°ããéã«if-elseæã誀çšãããšãäžèŠãªã©ããïŒèšæ¶èŠçŽ ïŒãçæ ãããããšããããŸãã
ããã¯ãif-elseãããã¯ã®äžã§ãã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠæç€ºçã«å€ã代å
¥ããŠããªã å Žåã«çºçããŸãã
â ã©ãããçºçããæªãäŸ
always_comb begin
if (a == 1'b1)
y = b; // a == 0 ã®å Žåãyã®å€ãä¿æããã
end
ãªãã©ãããçºçããã®ãïŒ
a == 1'b1
ã®å Žåã¯y = b;
ãšä»£å ¥ãããã- ãããã
a == 0
ã®å Žåã«ã¯y
ã«æ°ããå€ãä»£å ¥ãããªããããåã®å€ãä¿æãããïŒããã¯ã¡ã¢ãªèŠçŽ ïŒã©ããã®åäœïŒã - æå³ããªãç¶æ ãçºçããèšèšã®ãã°ã«ã€ãªããã
â¡ ã©ãããåé¿ããæ£ããèšè¿°
ã©ãããé²ãã«ã¯ãelseå¥ãå¿ ãèšè¿°ãããã¹ãŠã®æ¡ä»¶ã§ä»£å ¥ãè¡ã å¿ èŠããããŸãã
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // æç€ºçã«yã«å€ãèšå®ãã
end
⢠default
å€ãèšå®ãã
always_comb begin
y = 1'b0; // ããã©ã«ãå€ãèšå®
if (a == 1'b1)
y = b;
end
â ãã€ã³ãïŒãã¹ãŠã®æ¡ä»¶ã§å€æ°ã«å€ãèšå®ããã°ãã©ããã¯çºçããªãïŒ
5-2. always_comb
ã always_ff
ã®æŽ»çš
Verilog 2001 以éã§ã¯ãçµã¿åããåè·¯ãšé åºåè·¯ãæç¢ºã«åºå¥ããããã«ã以äžã®ãã㪠always_comb
ãš always_ff
ã䜿çšããããšãæšå¥š ãããŠããŸãã
â çµã¿åããåè·¯ïŒalways_combïŒ
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0;
end
always_comb
㯠èªåçã«æåºŠãªã¹ãïŒ(*)
ïŒãæ±ºå® ãããããæåã§always @(*)
ãèšè¿°ããå¿ èŠããããŸããã- èšèšã®æå³ãæç¢ºã«ãªããããŒã«ã«ããæé©åãè¡ãããããªããŸãã
â¡ é åºåè·¯ïŒalways_ffïŒ
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
always_ff
ã䜿çšããããšã§ããã®ãããã¯ã ã¯ããã¯é§åã®ããªããããããã§ããããšãæç€º ã§ãããalways @ (posedge clk or posedge reset)
ãšæžãããã å¯èªæ§ãåäžããèšèšãã¹ãæžããããšãã§ããã
5-3. if-elseæã®å¯èªæ§ãåäžããããã¯ããã¯
if-elseæã¯äŸ¿å©ã§ããããã¹ããæ·±ããªããš å¯èªæ§ãäœäž ããå¯èœæ§ããããŸãã
以äžã®ãã¯ããã¯ã䜿ã£ãŠãããèªã¿ãããã³ãŒããæžãããšãã§ããŸãã
â ãã¹ããæžãã
if-elseæãæ·±ããªããšãã³ãŒããèªã¿ã¥ãããªããŸãã
以äžã®ããã« case
æã掻çšããããšã§ããã¹ããæžãããèŠãããã³ãŒã ã«ããããšãã§ããŸãã
æªãäŸïŒãã¹ããæ·±ãïŒ
always_comb begin
if (mode == 2'b00) begin
if (enable) begin
y = a;
end else begin
y = b;
end
end else begin
y = c;
end
end
æ¹åäŸïŒcaseæã掻çšïŒ
always_comb begin
case (mode)
2'b00: y = enable ? a : b;
default: y = c;
endcase
end
case
æã䜿ãããšã§ãæ¡ä»¶åå²ãæŽçããã³ãŒããã·ã³ãã«ã«ã§ããã?
ïŒæ¡ä»¶æŒç®åïŒã掻çšããããšã§ãif-elseæãççž®ã§ããã
ãŸãšã
â
if-elseæã䜿ãéã¯ããã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠæç€ºçã«å€ã代å
¥ããã©ãããé²ãã
â
çµã¿åããåè·¯ã§ã¯ always_comb
ãé åºåè·¯ã§ã¯ always_ff
ã䜿çšããããšã§ãæå³ãæç¢ºã«ããã
â
ãã¹ããæ·±ããªããããå Žåã¯ãcaseæã掻çšããŠæŽçããã
â
å¯èªæ§ãåäžãããããã«ã倿°åãå
·äœçã«ããã
6. ãããã質åïŒFAQïŒ
Verilogã®if-else
æã¯åºæ¬çãªæ¡ä»¶åå²ãšããŠåºã䜿çšãããŸãããåå¿è
ããäžçŽè
ãŸã§ãããããçåãåé¡ç¹ ãããã€ãååšããŸãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããif-elseæã®ã©ããçºçåé¡ãããcaseæãšã®éããããåŠçé床ãžã®åœ±é¿ã ãªã©ã«ã€ããŠããããã質åãšãã®åçãQ&A圢åŒã§è§£èª¬ããŸãã
Q1: Verilogã®if-elseæã䜿ããšã©ãããçæãããã®ã¯ãªãïŒåé¿æ¹æ³ã¯ïŒ
A1: ã©ãããçæãããåå
Verilogã§ã¯ãif-elseæã®äžã§ãã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠå€ãæç€ºçã«ä»£å
¥ããªãå Žåãã©ããïŒèšæ¶èŠçŽ ïŒãèªåçã«çæ ãããŸãã
ããã¯ãã·ã³ã»ãµã€ã¶ïŒè«çåæããŒã«ïŒããæªå®çŸ©ã®æ¡ä»¶ã§ãåã®å€ãä¿æããå¿
èŠãããããšå€æããããã§ãã
ã©ãããçºçããæªãäŸ
always_comb begin
if (a == 1'b1)
y = b; // a == 0 ã®å Žåãyã®å€ãä¿æããã
end
ã©ãããåé¿ããæ¹æ³
â else å¥ãå¿ ãèšè¿°ãã
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // æç€ºçã«å€ã代å
¥
end
â¡ ããã©ã«ãå€ãèšå®ãã
always_comb begin
y = 1'b0; // åæå€ãèšå®
if (a == 1'b1)
y = b;
end
â ãã€ã³ãïŒãã¹ãŠã®æ¡ä»¶ã§å€æ°ã«å€ãèšå®ããã°ãã©ããã¯çºçããªãïŒ
Q2: if-elseæãšcaseæã®éãã¯ïŒã©ã¡ãã䜿ãã¹ãïŒ
A2: 䜿ãåãã®ãã€ã³ã
æ¡ä»¶ã®ç¹æ§ | 䜿ãã¹ãæ |
---|---|
æ¡ä»¶ãç¯å²æå®ïŒäŸ: 10 <= x <= 20 ïŒ | if-else |
ç¹å®ã®å€ããšã«åŠçãåå² | case |
åªå é äœããã | if-else |
å岿°ãå€ã | case |
Q3: Verilogã®if-elseæã¯åŠçé床ã«åœ±é¿ããïŒ
A3: if-elseæèªäœã®é床ã¯èšèšæ¬¡ç¬¬
- Verilogã¯ããŒããŠã§ã¢èšè¿°èšèªã§ãããå®éã®åŠçé床ã¯åæãããããŒããŠã§ã¢ã®æ§é ã«ãã£ãŠæ±ºãŸãã
- if-elseæããã¹ããæ·±ããªããšãåæçµæã®é å»¶ãå¢ããå¯èœæ§ãããã
- ããããåæããŒã«ãæé©åãè¡ããããè«ççã«ç䟡ãªåè·¯ã§ããã°åºæ¬çã«ã¯å€§ããªå·®ã¯çããªãã
â
åŠçé床ãæé©åããããã®ãã€ã³ã
if-elseæã®ãã¹ããæžãã
always_comb begin
case (a)
1: y = 10;
2: y = 20;
default: y = 30;
endcase
end
â äžèŠãªåå²ãæžãããã·ã³ãã«ãªè«çåè·¯ãæ§æãã
Q4: if-elseæã§ã®ä»£å
¥ã« =
ãš <=
ã®ã©ã¡ãã䜿ãã¹ãïŒ
A4: =
ïŒããããã³ã°ä»£å
¥ïŒãš <=
ïŒãã³ããããã³ã°ä»£å
¥ïŒã®éã
ä»£å ¥ã®çš®é¡ | çšé |
---|---|
= ïŒããããã³ã°ä»£å
¥ïŒ | çµã¿åããåè·¯ïŒalways_combïŒ |
<= ïŒãã³ããããã³ã°ä»£å
¥ïŒ | é åºåè·¯ïŒalways_ffïŒ |
â
çµã¿åããåè·¯ã§ã¯ =
ã䜿ã
always_comb begin
if (a == 1)
y = b; // ããããã³ã°ä»£å
¥
end
â
é åºåè·¯ïŒã¬ãžã¹ã¿ïŒã§ã¯ <=
ã䜿ã
always_ff @(posedge clk) begin
if (reset)
y <= 0; // ãã³ããããã³ã°ä»£å
¥
else
y <= d;
end
Q5: if-elseæã®ãã¹ããæžããã«ã¯ã©ãããã°ããïŒ
A5: caseæãæ¡ä»¶æŒç®åãæŽ»çšãã
æªãäŸïŒãã¹ããæ·±ãïŒ
always_comb begin
if (mode == 2'b00) begin
if (enable) begin
y = a;
end else begin
y = b;
end
end else begin
y = c;
end
end
æ¹åäŸïŒcaseæã掻çšïŒ
always_comb begin
case (mode)
2'b00: y = enable ? a : b;
default: y = c;
endcase
end
â
ãã€ã³ãïŒæ¡ä»¶æŒç®å ? :
ãæŽ»çšãããšãif-elseæãççž®ã§ããïŒ
ãŸãšã
â
if-elseæãé©åã«äœ¿ããªããšã©ãããçºçãããåé¿ããã«ã¯ else
å¥ãããã©ã«ãå€ãèšå®ããã
â
åºå®å€ã®æ¯èŒãå€ãå Žåã¯caseæãç¯å²ãåªå
é äœãããå Žåã¯if-elseã䜿çšã
â
é åºåè·¯ã§ã¯ <=
ïŒãã³ããããã³ã°ä»£å
¥ïŒãçµã¿åããåè·¯ã§ã¯ =
ïŒããããã³ã°ä»£å
¥ïŒã䜿ãã
â
ãã¹ããæ·±ããªãå Žå㯠case
æãæ¡ä»¶æŒç®åã䜿ããå¯èªæ§ãåäžãããã
7. ãŸãšã
Verilogã®if-else
æã¯ãããžã¿ã«åè·¯ã®èšèšã«ãããŠéåžžã«éèŠãªæ¡ä»¶åå²ã®ææ³ã§ããæ¬èšäºã§ã¯ãif-else
æã®åºæ¬æ§æããå¿çšããã¹ããã©ã¯ãã£ã¹ãããããçåãŸã§ã詳现ã«è§£èª¬ããŸããã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããããŸã§ã®å 容ãç·æ¬ããif-elseæãé©åã«äœ¿ãããã®éèŠãªãã€ã³ããæŽçããŸãã
7-1. Verilogã®if-elseæã®åºæ¬ãã€ã³ã
â åºæ¬æ§æ
if-else
æã¯ãæ¡ä»¶åå²ãè¡ãããã®åºæ¬çãªæ§æ ã§ããã- çµã¿åããåè·¯ ã§ã¯
always_comb
å ã§äœ¿çšãããã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠå€ãä»£å ¥ãã ããšãéèŠã
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // ã©ãããé²ãããã«ããã©ã«ãå€ãèšå®
end
- é åºåè·¯ïŒã¯ããã¯é§åã®åè·¯ïŒ ã§ã¯
always_ff
ã䜿çšãããã³ããããã³ã°ä»£å ¥ (<=
) ã䜿ãã
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
â
ãã€ã³ãïŒçµã¿åããåè·¯ã§ã¯ =
ãé åºåè·¯ã§ã¯ <=
ã䜿ãïŒ
7-2. if-elseæã®é©åãªäœ¿ãæ¹
â çµã¿åããåè·¯ã§äœ¿çšããå Žå
always_comb
ã䜿ãããã¹ãŠã®æ¡ä»¶ã«å€ãä»£å ¥ããããšã§ ã©ããã®çºçãé²ãã- ããã©ã«ãå€ãèšå®ããããšã§ãæªå®çŸ©ã®åäœãåé¿ã§ããã
â é åºåè·¯ã§äœ¿çšããå Žå
always_ff
ã䜿ããif-else
æãå©çšã㊠ã¯ããã¯ããšã«ç¶æ ãæŽæ° ããã<=
ïŒãã³ããããã³ã°ä»£å ¥ïŒã䜿çšããããšã§ ã·ãã¥ã¬ãŒã·ã§ã³ãšããŒããŠã§ã¢ã®åäœãäžèŽ ãããã
â if-elseæãé©ããŠããå Žé¢
æ¡ä»¶ã®ç¹æ§ | 䜿ãã¹ãæ |
---|---|
æ¡ä»¶ãç¯å²æå®ïŒäŸ: 10 <= x <= 20 ïŒ | if-else |
åªå
é äœãããïŒäŸ: if (x == 1) ã®åŸ else if (x == 2) ïŒ | if-else |
ç°¡åãªæ¡ä»¶åå²ïŒ2ïœ3æ¡ä»¶çšåºŠïŒ | if-else |
7-3. caseæãšã®äœ¿ãåã
if-elseæã¯ãæ¡ä»¶ãé£ç¶çãªç¯å²ãåªå
é äœãããå Žåã«é©ããŠããŸãã
äžæ¹ãåå¥ã®å€ããšã«åå²ããå Žåããåå²ã®çš®é¡ãå€ãå Žåã«ã¯caseæã®æ¹ãé©ããŠãã ãããé©åã«äœ¿ãåããããšãéèŠã§ãã
â caseæãé©ããŠããå Žé¢
æ¡ä»¶ã®ç¹æ§ | 䜿ãã¹ãæ |
---|---|
ç¹å®ã®å€ããšã«åŠçãåå²ïŒäŸ: state == IDLE, RUNNING, STOP ïŒ | case |
å岿°ãå€ãïŒäŸ: 8çš®é¡ä»¥äžã®åå²ïŒ | case |
ç¶æ é·ç§»ïŒFSM: Finite State MachineïŒ | case |
7-4. if-elseæã®ãã¹ããã©ã¯ãã£ã¹
â ã©ãããé²ãããã«ãã¹ãŠã®æ¡ä»¶ã§ä»£å ¥ãè¡ã
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // å¿
ã代å
¥ãè¡ã
end
â
always_comb
ã always_ff
ãæ£ãã䜿ã
always_comb begin // çµã¿åããåè·¯
if (a == 1'b1)
y = b;
else
y = 1'b0;
end
always_ff @(posedge clk) begin // é åºåè·¯
if (reset)
y <= 0;
else
y <= d;
end
â ãã¹ããæ·±ããªããããå Žåã¯caseæã䜿çš
always_comb begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
default: y = d;
endcase
end
7-5. ãããããã¹ãšãã®å¯Ÿç
ééã | æ£ããæžãæ¹ |
---|---|
ã©ãããçºçããïŒelse ãçç¥ïŒ | else ãèšè¿°ãããã¹ãŠã®æ¡ä»¶ã«å¯ŸããŠå€ã代å
¥ãã |
é åºå路㧠= ã䜿ã | <= ïŒãã³ããããã³ã°ä»£å
¥ïŒã䜿çšãã |
ãã¹ããæ·±ããã | case æã䜿çšããŠå¯èªæ§ãåäžããã |
7-6. ãŸãšã
â
if-elseæã¯çµã¿åããåè·¯ãšé åºåè·¯ã®äž¡æ¹ã§äœ¿çšã§ããããããããé©åãªèšè¿°æ¹æ³ãããã
â
ãã¹ãŠã®æ¡ä»¶ã«å€ã代å
¥ããªããšãã©ãããçºçããå¯èœæ§ãããããæ³šæãå¿
èŠã
â
åºå®å€ã®æ¯èŒãå€ãå Žåã¯caseæãç¯å²ãåªå
é äœãããå Žåã¯if-elseã䜿çšã
â
é åºåè·¯ã§ã¯ <=
ïŒãã³ããããã³ã°ä»£å
¥ïŒãçµã¿åããåè·¯ã§ã¯ =
ïŒããããã³ã°ä»£å
¥ïŒã䜿ãã
â
ãã¹ããæ·±ããªããããå Žå㯠case
æãæ¡ä»¶æŒç®åã䜿ããå¯èªæ§ãåäžãããã
7-7. 次ã®ã¹ããã
æ¬èšäºã§ã¯ãVerilogã®if-elseæã«ã€ããŠ åºæ¬ããå¿çšãæé©ãªæžãæ¹ãã±ãŒã¹å¥ã®äœ¿ãåãããã¹ããã©ã¯ãã£ã¹ ãŸã§è§£èª¬ããŸããã
ä»åŸãããå®è·µçãªã³ãŒããåŠã¶ããã«ã以äžã®ãããªãããã¯ãåŠç¿ããããšãããããããŸãïŒ
â
Verilogã®ç¶æ
é·ç§»åè·¯ïŒFSMïŒã®èšèš
â
caseæã掻çšããå¹ççãªå¶åŸ¡
â
ãã€ãã©ã€ã³èšèšã«ãããif-elseæã®å¿çš
â
ã¯ããã¯åæèšèšã®æé©å
Verilogã®çè§£ãæ·±ããããæé©ãªããžã¿ã«åè·¯èšèšãè¡ããŸãããïŒð