Update xilinx-hints.txt from Larry.
This commit is contained in:
parent
e58be1b128
commit
2bc8f79e0f
|
|
@ -1,21 +1,14 @@
|
||||||
|
|
||||||
For those of you who wish to use Icarus Verilog, in combination with
|
For those of you who wish to use Icarus Verilog, in combination with
|
||||||
the Xilinx back end (Foundation or Alliance), it can be done. I have
|
the Xilinx back end (Foundation or Alliance), it can be done. I have
|
||||||
run some admittedly simple (no arithmetic, 600 equivalent gates) designs
|
run some admittedly simple (2300 equivalent gates) designs through this
|
||||||
through this setup, targeting a Spartan XCS10.
|
setup, targeting a Spartan XCS10.
|
||||||
|
|
||||||
Verilog:
|
Verilog:
|
||||||
|
|
||||||
As of Icarus Verilog 19990814, you still can't have logic buried
|
Older versions of Icarus Verilog (like 19990814) couldn't synthesize
|
||||||
in procedural (flip-flop) assignment. I use a hacked workaround
|
logic buried in procedural (flip-flop) assignment. Newer versions
|
||||||
copy of ivl that allows 1-bit wide logic. The other approach
|
(like 20000120) don't have this limitation.
|
||||||
is to use temporary wires, assign them to the logic, and assign
|
|
||||||
the reg to that wire. For example, instead of
|
|
||||||
always @ (posedge Clk) Z = ~Q1 & ~Q2 & ~Q3 & ~Q4;
|
|
||||||
you can write
|
|
||||||
wire newZ;
|
|
||||||
assign newZ = ~Q1 & ~Q2 & ~Q3 & ~Q4;
|
|
||||||
always @ (posedge Clk) Z = newZ;
|
|
||||||
|
|
||||||
Procedural assignments have to be given one at a time, to be
|
Procedural assignments have to be given one at a time, to be
|
||||||
"found" by xnfsyn. Say
|
"found" by xnfsyn. Say
|
||||||
|
|
@ -27,36 +20,29 @@ Verilog:
|
||||||
Z = newZ;
|
Z = newZ;
|
||||||
end
|
end
|
||||||
|
|
||||||
I had reason to use a global clock net. I used this snippet of
|
Steve's xnf.txt covers most buffer and pin constructs, but I had reason
|
||||||
Verilog code to make it happen:
|
to use a global clock net not connected to an input pin. The standard
|
||||||
primitive BUFG ( O, I );
|
Verilog for a buffer, combined with a declaration to turn that into a
|
||||||
output O;
|
BUFG, is:
|
||||||
input I;
|
buf BUFG( your_output_here, your_input_here );
|
||||||
table
|
|
||||||
0:0;
|
|
||||||
1:1;
|
|
||||||
endtable
|
|
||||||
endprimitive
|
|
||||||
$attribute(BUFG,"XNF-LCA","BUFG:O,I")
|
$attribute(BUFG,"XNF-LCA","BUFG:O,I")
|
||||||
|
|
||||||
Oh, yes, you probably also want to choose I/O pins! Try this:
|
I use post-processing on my .xnf files to add "FAST" attributes to
|
||||||
wire d1;
|
output pins.
|
||||||
$attribute(d1, "PAD", "i45"); // input
|
|
||||||
wire vsync;
|
|
||||||
$attribute(vsync, "PAD", "o67"); // output
|
|
||||||
|
|
||||||
Running ivl:
|
Running ivl:
|
||||||
|
|
||||||
The -F switches are important. The following order seems to robustly
|
The -F switches are important. The following order seems to robustly
|
||||||
generate valid XNF files:
|
generate valid XNF files, and is used by "verilog -X":
|
||||||
-Fxnfio -Fnobufz -Fsigfold -Fxnfsyn
|
-Fsynth -Fnodangle -Fxnfio
|
||||||
|
|
||||||
Generating .pcf files:
|
Generating .pcf files:
|
||||||
|
|
||||||
The ngdbuild step seems to lose pin placement information that ivl
|
The ngdbuild step seems to lose pin placement information that ivl
|
||||||
puts in the XNF file. Use xnf2pcf to extract this information to
|
puts in the XNF file. Use xnf2pcf to extract this information to
|
||||||
a .pcf file, which the Xilinx place-and-route software _will_ pay
|
a .pcf file, which the Xilinx place-and-route software _will_ pay
|
||||||
attention to.
|
attention to. Steve says he now makes that information available
|
||||||
|
in an NCF file, with -fncf=<path>, but I haven't tested that.
|
||||||
|
|
||||||
Running the Xilinx back end:
|
Running the Xilinx back end:
|
||||||
|
|
||||||
|
|
@ -76,6 +62,23 @@ Running the Xilinx back end:
|
||||||
.xnf, .pcf, .ngd, .ncd, and .bit), so this sequence is best done in a
|
.xnf, .pcf, .ngd, .ncd, and .bit), so this sequence is best done in a
|
||||||
dedicated directory. Note in particular that map.ncd is a generic name.
|
dedicated directory. Note in particular that map.ncd is a generic name.
|
||||||
|
|
||||||
|
I had reason to run this remotely (and transparently within a Makefile)
|
||||||
|
via ssh. I use the gmake rule
|
||||||
|
%.bit : %.xnf
|
||||||
|
ssh -x -a -o 'BatchMode yes' ${ALLIANCE_HOST} \
|
||||||
|
remote_alliance ${REMOTE_DIR} $(basename $@) 2>&1 < $<
|
||||||
|
scp ${ALLIANCE_HOST}:${REMOTE_DIR}/$@ .
|
||||||
|
and the remote_alliance script (on ${ALLIANCE_HOST})
|
||||||
|
/bin/csh
|
||||||
|
cd $1
|
||||||
|
cat >! $2.xnf
|
||||||
|
xnf2pcf <$2.xnf >! $2.pcf
|
||||||
|
./backend $2
|
||||||
|
|
||||||
|
There is now a "Xilinx on Linux HOWTO" at
|
||||||
|
http://www.polybus.com/xilinx_on_linux.html
|
||||||
|
I havn't tried this yet, it looks interesting.
|
||||||
|
|
||||||
Downloading:
|
Downloading:
|
||||||
|
|
||||||
I use the XESS (http://www.xess.com/) XSP-10 development board, which
|
I use the XESS (http://www.xess.com/) XSP-10 development board, which
|
||||||
|
|
@ -90,3 +93,4 @@ The above hints are based on my experience with Foundation 1.5 on NT
|
||||||
(gack) and Alliance 2.1i on Solaris. Your mileage may vary. Good luck!
|
(gack) and Alliance 2.1i on Solaris. Your mileage may vary. Good luck!
|
||||||
|
|
||||||
- Larry Doolittle <LRDoolittle@lbl.gov> August 19, 1999
|
- Larry Doolittle <LRDoolittle@lbl.gov> August 19, 1999
|
||||||
|
updated February 1, 2000
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue