Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
17240 Discussions

How about a verilog case statement that covers a range?

Altera_Forum
Honored Contributor II
13,275 Views

How about a verilog case statement that covers a range?  

e.g. :  

 

 

case(xcount) begin  

1-100 : junk<=1;  

101 : junk<=2;  

102-200 : junk<=3;  

endcase
0 Kudos
6 Replies
Altera_Forum
Honored Contributor II
7,563 Views

SystemVerilog has it using the inside operator 

 

case (xcount) inside : junk<=1; 101 : junk<=2; : junk<=3; endcase  

 

Another nice thing about the case inside statement is that it uses asymmetric wildcard matching.  

 

case (xcode) inside 3'b00? : junk<=1; 3'b0?0 : junk<=2; 3'b?00 : junk<=3; default: junk <='x; endcase That means don't cares only match on the case item, not the selecting expression. So if xcode == 3'bx01, the default branch would be taken, not the first branch.
0 Kudos
Altera_Forum
Honored Contributor II
7,563 Views

 

--- Quote Start ---  

SystemVerilog has it using the inside operator 

 

case (xcount) inside : junk<=1; 101 : junk<=2; : junk<=3; endcase  

 

Another nice thing about the case inside statement is that it uses asymmetric wildcard matching.  

 

case (xcode) inside 3'b00? : junk<=1; 3'b0?0 : junk<=2; 3'b?00 : junk<=3; default: junk <='x; endcase That means don't cares only match on the case item, not the selecting expression. So if xcode == 3'bx01, the default branch would be taken, not the first branch. 

--- Quote End ---  

 

 

Thanks very much. But I think this "inside" only for SystemVerilog, right?
0 Kudos
Altera_Forum
Honored Contributor II
7,563 Views

Yes. Hopefully if more people ask for it, it will become more widely supported. 

 

To code this in Verilog, you could create an in-between function or macro 

 

function reg inbetween(input low, value, high); begin inbetween = value >= low && value <= high; end endfunction case (1); inbetween(1,xcount,100): junk<=1; inbetween(101,xcount,101): junk<=2; inbetween(102,xcount,200): junk<=3; endcase
0 Kudos
Altera_Forum
Honored Contributor II
7,563 Views

 

--- Quote Start ---  

Yes. Hopefully if more people ask for it, it will become more widely supported. 

 

To code this in Verilog, you could create an in-between function or macro 

 

function reg inbetween(input low, value, high); begin inbetween = value >= low && value <= high; end endfunction case (1); inbetween(1,xcount,100): junk<=1; inbetween(101,xcount,101): junk<=2; inbetween(102,xcount,200): junk<=3; endcase 

--- Quote End ---  

 

 

 

Thanks dave. Yes, I think this is very good idea. And this should be able to be synthesized, right?
0 Kudos
Altera_Forum
Honored Contributor II
7,563 Views

 

--- Quote Start ---  

SystemVerilog has it using the inside operator 

 

case (xcount) inside : junk<=1; 101 : junk<=2; : junk<=3; endcase  

 

Another nice thing about the case inside statement is that it uses asymmetric wildcard matching.  

 

case (xcode) inside 3'b00? : junk<=1; 3'b0?0 : junk<=2; 3'b?00 : junk<=3; default: junk <='x; endcase That means don't cares only match on the case item, not the selecting expression. So if xcode == 3'bx01, the default branch would be taken, not the first branch. 

--- Quote End ---  

 

 

I added this syntax to an existing SystemVerilog design, but Quartus choked on the "inside" keyword when I tried to build. It's a little ironic, because the Quartus text editor recognizes it as a key word (it shows up in blue). Am I correct in saying that Quartus does not support "case inside"? I do not see it mentioned in the Quartus SV Support documentation.
0 Kudos
Altera_Forum
Honored Contributor II
7,563 Views

It is very easy to recognize a list of keywords to prevent people from using them as identifiers. Supporting the functionality behind them is another story.

0 Kudos
Reply