The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl Design Languages >> Verilog-AMS >> Syntax error in case statement https://designers-guide.org/forum/YaBB.pl?num=1138986450 Message started by yongjin CHOI on Feb 3rd, 2006, 9:16am |
Title: Syntax error in case statement Post by yongjin CHOI on Feb 3rd, 2006, 9:16am Hi, As a beginner for learning verilog-A, I got a syntax error when I tried to implement 4-bit lookup table with a case statement. I couldn't figure out why Synopsys hspice 2005 complains my code "lookup.va" with the following errors. Is anyone suggesting me the reason or the simple way to implement 4-bit lookup table? Any comments would be welcome. Yongjin CHOI hsp-vacomp: Synopsys HSPICE Verilog-A Compiler Version 1.26.111705. hsp-vacomp: Copyright (C) 2005 Synopsys, Inc. All Rights Reserved. hsp-vacomp: hsp-vacomp: Error: Missing array index in using 'result'. hsp-vacomp: ['lookup.va',30] ** error ** During Verilog-A Device processing: Failed to compile the Verilog-A File, 'lookup.va'. // Simple Lookup table 'lookup.va' `include "disciplines.vams" `include "constants.vams" module lookup(out,in); parameter real vdd = 2.5; parameter real thresh = vdd/2; parameter real tt=0.1n from (0:inf); // transition time of output signal parameter real td=0 from (0:inf); // average delay from input to output input [0:3] in; output [0:3] out; electrical [0:3] in; electrical [0:3] out; integer result [0:3]; real vout [0:3]; genvar i; analog begin for (i=0; i < 4; i=i+1) begin if(V(in[i]) >= thresh) begin result[i]= 1; end else begin result[i]=0; end end //for case(result) 4'b0000 : begin vout[0]= 3; vout[1]= 0; vout[2]= 0; vout[3]= 0; end 4'b0001 : begin vout[0]= 0; vout[1]= 3; vout[2]= 0; vout[3]= 0; end 4'b0010 : begin vout[0]= 0; vout[1]= 0; vout[2]= 3; vout[3]= 0; end 4'b0011 : begin vout[0]= 0; vout[1]= 0; vout[2]= 0; vout[3]= 3; end 4'b0100 : begin vout[0]= 1; vout[1]= 0; vout[2]= 0; vout[3]= 0; end 4'b0101 : begin vout[0]= 0; vout[1]= 1; vout[2]= 0; vout[3]= 0; end 4'b0110 : begin vout[0]= 0; vout[1]= 0; vout[2]= 1; vout[3]= 0; end 4'b0111 : begin vout[0]= 0; vout[1]= 0; vout[2]= 0; vout[3]= 1; end 4'b1000 : begin vout[0]=-1; vout[1]= 0; vout[2]= 0; vout[3]= 0; end 4'b1001 : begin vout[0]= 0; vout[1]=-1; vout[2]= 0; vout[3]= 0; end 4'b1010 : begin vout[0]= 0; vout[1]= 0; vout[2]=-1; vout[3]= 0; end 4'b1011 : begin vout[0]= 0; vout[1]= 0; vout[2]= 0; vout[3]=-1; end 4'b1100 : begin vout[0]=-3; vout[1]= 0; vout[2]= 0; vout[3]= 0; end 4'b1101 : begin vout[0]= 0; vout[1]=-3; vout[2]= 0; vout[3]= 0; end 4'b1110 : begin vout[0]= 0; vout[1]= 0; vout[2]=-3; vout[3]= 0; end 4'b1111 : begin vout[0]= 0; vout[1]= 0; vout[2]= 0; vout[3]=-3; end endcase V(out) <+ transition(vout,td, tt); end //analog endmodule |
Title: Re: Syntax error in case statement Post by Geoffrey_Coram on Feb 6th, 2006, 4:45am It looks like the compiler doesn't like the fact that your case expression case (result) doesn't select a particular element of result. Perhaps the compiler thinks you have an "analog case statement" where the expression must be a genvar_expression? However, it seems to me that your case statement is legal syntax for 1364-Verilog, and thus should be accepted. I have two warnings for other elements in your module: 1) transition() returns a real number, not an array, so you need to do for (i=0; ,<4; i=i+1) V(out[i]) <+ transition(vout[i], td, tt); 2) your bit orders are reversed; usually, one has input [3:0] in; output [3:0] out; etc. |
Title: Re: Syntax error in case statement Post by Boris_Troyanovsky on Feb 8th, 2006, 12:20pm Hi Yongjin, It looks as though your intent is to set individual bits within "result" to indicate whether V(in[i]) is above or below a certain threshold. However, declaring "result" as integer result [0:3]; will give you an array of four integers, and not four bits. The compiler reports an error on the "case(result)" line because it expects to receive an integer value, rather than an array of integers (it could concatenate the integers together into a big bitfield, but I don't think that would give you the result that you expect based on your case-stmnt contents). The way to address this issue is to simply use integer result; as your datatype, since a single integer contains more than four bits. You can then use bitwise ops, along with shifts, to set the proper bits as follows: analog begin result = 0; for (i=0; i < 4; i=i+1) begin if(V(in[i]) >= thresh) result = result | (1 << i); end //for .... case stmnt goes here unchanged, etc. Lastly, on your transition statement, you would want to loop through each of the values as follows: for(i = 0; i < 4; i = i+1) V(out[i]) <+ transition(vout[i],td, tt); As Geoffrey mentions above, your bit order (most significant bit vs. least significant bit) may or (may not) be in the order that you intended, so that might be something to have a look at as well. - Boris |
Title: Re: Syntax error in case statement Post by jbdavid on Apr 21st, 2006, 2:14am Alternatively you could declare result as reg [3:0] result. so that you get the logic values into the 4 bits.. but for that to work the complier (and simulator) would have to support verilog-AMS, not just the verilog-A subset.. Jonathan |
The Designer's Guide Community Forum » Powered by YaBB 2.2.2! YaBB © 2000-2008. All Rights Reserved. |