1
\$\begingroup\$

I'm still playing in the lowest Verilog level (gate level). I found this post:

Is it possible to create a working JK-flip flop using gate level description in Verilog

In that, I could understand that the idea should work, and I could solve it with a Master-Slave JK Flip-Flop used as a frequency divider. I use Icestorm toolchain; Yosys is not complaining, but Next-PNR is giving me this error:

ERROR: timing analysis failed due to presence of combinatorial loops, incomplete specification of timing ports, etc.

This is my code:

module syncRX(clk, signal, detect); output wire [7:0] detect; input clk, signal; reg [6:0] det = 7'b1001010; assign detect = {det, jk5_out}; jk_flip_flop_edge_triggered jk0(.Q(jk5_out), .Qn(Qn), .C(clk), .J(1), .K(1), .RESETn(0)); endmodule // top module jk_flip_flop_edge_triggered(Q, Qn, C, J, K, RESETn); output Q; output Qn; input C; input J; input K; input RESETn; wire Kn; // The complement of the K input. wire D; wire D1; // Data input to the D latch. wire Cn; // Control input to the D latch. wire Cnn; // Control input to the SR latch. wire DQ; // Output from the D latch, inputs to the gated SR latch (S). wire DQn; // Output from the D latch, inputs to the gated SR latch (R). assign D1 = !RESETn ? 0 : D; // Upon reset force D1 = 0 not(Kn, K); and(J1, J, Qn); and(K1, Kn, Q); or(D, J1, K1); not(Cn, C); not(Cnn, Cn); d_latch dl(DQ, DQn, Cn, D1); sr_latch_gated sr(Q, Qn, Cnn, DQ, DQn); endmodule module d_latch(Q, Qn, G, D); output Q; output Qn; input G; input D; wire Dn; wire D1; wire Dn1; not(Dn, D); and(D1, G, D); and(Dn1, G, Dn); nor(Qn, D1, Q); nor(Q, Dn1, Qn); endmodule module sr_latch_gated(Q, Qn, G, S, R); output Q; output Qn; input G; input S; input R; wire S1; wire R1; and(S1, G, S); and(R1, G, R); nor(Qn, S1, Q); nor(Q, R1, Qn); endmodule 

I would like to know why and how it works.

\$\endgroup\$
3
  • \$\begingroup\$ The static timing analyzer built into nextpnr is designed to analyze synchronous logic. It takes a very different tool to properly analyze asynchronous state machines. \$\endgroup\$ Commented Aug 31, 2020 at 2:00
  • \$\begingroup\$ @DaveTweed Could be Arachne-pnr the good one? \$\endgroup\$ Commented Aug 31, 2020 at 4:51
  • \$\begingroup\$ No. See The Photon's answer. \$\endgroup\$ Commented Aug 31, 2020 at 10:57

1 Answer 1

4
\$\begingroup\$

I found this post: Is it possible to create a working JK-flip flop using gate level description in Verilog

Notice that the earlier question seems to be asking only about formally describing the JKFF in Verilog and simulating its behavior. While you seem to want to actually synthesize the device and implement it in an FPGA. These are two different problems.

I would like to know why

The real problem is that FPGAs aren't designed that way. They provide certain logic resources, mainly look-up tables (LUTs) which are just small RAMs that can be configured to act like arbitrary logic gates, and D flip-flops (DFFs), typically with a choice of asynchronous or synchronous reset. They also have routing resources, that is, paths for signals to travel between the logic blocks.

You can configure some LUTs to act like AND, OR, and NOT gates. And hook them up together to act like a JK flip-flop. But this isn't a very efficient use of resources, when you could use a DFF that is actually built in to the FPGA.

Therefore, the synthesis tool is simply not designed to work with this kind of design. It is designed to work with designs where all the combinatorial logic is implemented in LUTs and all the state is stored in DFFs. When your tool sees a feedback path in combinatorial logic that will preserve state, it simply isn't built to handle that, so it reports an error.

and how make it works!

The best way to make an FPGA design work is to design it around the resources that the FPGA actually provides: LUTs and DFFs. You can design your frequency divider to use D flip-flops instead of JK, and it will use much fewer FPGA resources and the synthesis tool will be much better able to optimize it. It will even likely use additional special-purpose logic resources (like carry chains) to optimize the counter implementation.

\$\endgroup\$
2
  • \$\begingroup\$ Just because of curiosity. Do you think that is coppible make it works? Maybe using time delay? (I tried but no difference) \$\endgroup\$ Commented Sep 1, 2020 at 8:55
  • \$\begingroup\$ It can be made to work. You’ll just have to turn off timing analysis somehow. And then you will have to find out the maximum clock speed experimentally each time you recompile the design. \$\endgroup\$ Commented Sep 1, 2020 at 14:17

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.