cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
18,492 Views
Registered: ‎04-23-2010

Assignment under multiple single edges is not supported for synthesis

Hi

I recently got a new Virtex-6 (ML605) board with ISE 11.3ver tool set.

I am doing basic testing to get used to it. 

 

Here is my code snipp:

 

module counter(Q, clk_l, rst);
   input    clk_l, rst;       
   output reg  [3:0] Q = 4'h0;
   
  always @ (posedge(clk_l) or posedge(rst)) begin  
   Q <= Q + 4'h1; // increment
   if(rst == 1'b1) // reset
     begin
      Q <= 4'h0;   
    end
   end

endmodule

 

When I synthesis my code I get following warnings,

 

WARNING:HDLCompiler:1128 - : Assignment under multiple single edges is not supported for synthesis
WARNING:Xst:647 - Input <clk_l> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

 

Also my code does not function on the virtex-6 FPGA.

 

Previously this code is testing on Spartan-3E FPGA with ISE 9.2 ver ans it worked properly.

Also when I modify  "always @ (posedge(clk_l) or posedge(rst))" to "always @ (posedge(clk_l) )" it works on Virtex-6 with ISE 11.3ver.

Can anyone tell what might be the reason for this?

 

 

- Raju

0 Kudos
7 Replies
Highlighted
Professor
Professor
18,482 Views
Registered: ‎08-14-2007

Re: Assignment under multiple single edges is not supported for synthesis

Synthesis generally uses templates to find known items like flip-flops

with asynchronous reset.  If you deviate enough from the template,

even though the code is equivalent it often fails to map your logic into

the proper flip-flop element.  I would suggest using the standard form

placing the reset term first and the clocked portion in the else like:

 

reg [3:0] foo;

 

always @ (posedge clk or posedge rst)

if (rst)

  foo <= 0;

else

  foo <= foo + 1;

 

While this is equivalent to:

 

always @ (posedge clk or posedge rst)

begin

  foo <= foo + 1;

  if (rst) foo <= 0;

end

 

the synthesis tool may have a hard time recognizing it.

 

When in doubt you can look in the language templates (light bulb icon in the ISE GUI)

to find the most reliable coding to generate the flip-flop or other structure you want.

 

By the way I have found that the synthesis tool also has a problem with

logic in the reset term like:

 

always @ (posedge clk or posedge (a | b))

if (a | b)

 . . .

 

equivalent to

 

wire c;

assign c = a | b;

always @ (posedge clk or posedge c)

if (c)

 . . .

 

The latter works in synthesis, the former does not.

 

HTH,

Gabor

-- Gabor
0 Kudos
Highlighted
18,463 Views
Registered: ‎04-23-2010

Re: Assignment under multiple single edges is not supported for synthesis

Hi Gabor. Thanks for the info.

When I synthisis my original code in ISE 11.3 and try to "create Timing Constarinats" it says "Design has no clock". And the code does'nt function on Virtex 6.

I am puzzled here because the same code worked in ISE 9.2 for Spartan 3E.

Is there any changes in coding standerds from ISE 9.2/Spartan3E to ISE 11.3/Virtes6 ?

 

Any help on this will be very helpful to me as many of my previous designs that worked in Spartan 3E are not working on Virtex 6.

 

- Raju

0 Kudos
Highlighted
18,462 Views
Registered: ‎04-23-2010

Re: Assignment under multiple single edges is not supported for synthesis

Additional info.

 

I tried even  with,

 

(* clock_signal = "yes" *)    input    clk; 

 

- Raju

0 Kudos
Highlighted
Professor
Professor
18,444 Views
Registered: ‎08-14-2007

Re: Assignment under multiple single edges is not supported for synthesis

This is really starting to sound like a typical messed-up project file

bug.  Did you start a new project with the  new ISE version tools,

or did you just open the original 9.2 project and upgrade it, make

changes, etc.?  I would suggest making a new project to see

if the problem persists.  If your project has a lot of files in it

you could also try to use the .restore file to recreate the project

file.  The instructions for this are in the project_name.restore

file which you can open with any text editor.

 

Regards,

Gabor

-- Gabor
0 Kudos
Highlighted
18,445 Views
Registered: ‎04-23-2010

Re: Assignment under multiple single edges is not supported for synthesis

The project has been build in ISE 11.3, from the original source files. Absolutly no project files of ISE 9.

 

- Raju

 

0 Kudos
Highlighted
Teacher
Teacher
18,431 Views
Registered: ‎08-14-2007

Re: Assignment under multiple single edges is not supported for synthesis

Hi,

XILINX has written new HDL-Parsers for the S6/V6 families. (at least for VHDL, but when I read this probably for verilog too)

So the synthesis rules may have changed with that.

 

Actually, I never understood thew reason why asynchronous resets in verilog are triggered with the posedge statement.

 

Something like

always @ (posedge(clk_l) or rst) begin

would be much more logical to me, (with my VHDL view of things).

Is that line legal verilog?

 

 

Just for completeness:

Has there be a recent change in the languange reference about this topic? 

Or is it just a bug? (Other verilog users should have observed it too then.)

 

Have a nice synthesis

  Eilert

 

 

0 Kudos
Highlighted
18,410 Views
Registered: ‎04-23-2010

Re: Assignment under multiple single edges is not supported for synthesis

Thanks Eilert.

 

So may be its the new parser.Think this new parser has some strict rules thatn its older version.

Hope to hear from other Virtex/ISE11.3 users.

 

Regards

Raju

0 Kudos