parent
09664bc52e
commit
76103f2167
10
BUGS.txt
10
BUGS.txt
|
|
@ -53,7 +53,7 @@ So, if your program doesn't compile, tell me so, tell me where the
|
||||||
error occurs, and include a complete Perfectly Valid Test Program(tm).
|
error occurs, and include a complete Perfectly Valid Test Program(tm).
|
||||||
You tell me that it fails to compile for you, and I find that it
|
You tell me that it fails to compile for you, and I find that it
|
||||||
compiles for me, then hooray I fixed it. It can happen, you
|
compiles for me, then hooray I fixed it. It can happen, you
|
||||||
know. What's on my disk is more recent then the latest snapshot.
|
know. What's on my disk is more recent than the latest snapshot.
|
||||||
|
|
||||||
If your program does compile, but generates incorrect output, I need
|
If your program does compile, but generates incorrect output, I need
|
||||||
to know what it says and what you think it should say. From this I can
|
to know what it says and what you think it should say. From this I can
|
||||||
|
|
@ -76,13 +76,13 @@ In this case, if possible include not only the sample verilog program,
|
||||||
but the generated netlist file(s) and a clear indication of what went
|
but the generated netlist file(s) and a clear indication of what went
|
||||||
wrong. If it is not clear to me, I will ask for clarification.
|
wrong. If it is not clear to me, I will ask for clarification.
|
||||||
|
|
||||||
* The Output is Correct, But Less Then Ideal
|
* The Output is Correct, But Less Than Ideal
|
||||||
|
|
||||||
If the output is strictly correct, but just not good enough for
|
If the output is strictly correct, but just not good enough for
|
||||||
practical use, I would like to know. These sorts of problems are
|
practical use, I would like to know. These sorts of problems are
|
||||||
likely to be more subjective then a core dump, but are worthy of
|
likely to be more subjective than a core dump, but are worthy of
|
||||||
consideration. However, realize that outright errors will get more
|
consideration. However, realize that outright errors will get more
|
||||||
attention then missed optimizations.
|
attention than missed optimizations.
|
||||||
|
|
||||||
THE MAKING OF A GOOD TEST PROGRAM
|
THE MAKING OF A GOOD TEST PROGRAM
|
||||||
|
|
||||||
|
|
@ -104,7 +104,7 @@ module may not be needed as long as the ``-s <name>'' switch is
|
||||||
given.
|
given.
|
||||||
|
|
||||||
So when you send a test case, ask yourself "Can poor overworked Steve
|
So when you send a test case, ask yourself "Can poor overworked Steve
|
||||||
invoke the error without any Verilog other then what is included?" And
|
invoke the error without any Verilog other than what is included?" And
|
||||||
while we are at it, please place a copyright notice in your test
|
while we are at it, please place a copyright notice in your test
|
||||||
program and include a GPL license statement if you can. Your test
|
program and include a GPL license statement if you can. Your test
|
||||||
program may find its way into the test suite, and the notices will
|
program may find its way into the test suite, and the notices will
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ SHELL = /bin/sh
|
||||||
# This string is used as an installation suffix. It modifies certain
|
# This string is used as an installation suffix. It modifies certain
|
||||||
# key install paths/files such that a build and install of Icarus Verilog
|
# key install paths/files such that a build and install of Icarus Verilog
|
||||||
# with the same $(prefix) but a different $(suffix) will not interfere.
|
# with the same $(prefix) but a different $(suffix) will not interfere.
|
||||||
# The normal configuratin leaves suffix empty
|
# The normal configuration leaves suffix empty
|
||||||
suffix = @install_suffix@
|
suffix = @install_suffix@
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
|
|
|
||||||
2
cprop.cc
2
cprop.cc
|
|
@ -885,7 +885,7 @@ void cprop_functor::lpm_mux(Design*des, NetMux*obj)
|
||||||
|
|
||||||
/* Otherwise, we cannot accurately do a substitution. If
|
/* Otherwise, we cannot accurately do a substitution. If
|
||||||
one input is non-constant, then that input may have a
|
one input is non-constant, then that input may have a
|
||||||
HiZ value, and there is no Verilog logic other then a
|
HiZ value, and there is no Verilog logic other than a
|
||||||
MUX that can pass a HiZ value. */
|
MUX that can pass a HiZ value. */
|
||||||
flag = false;
|
flag = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,10 +28,10 @@ extern const char*base;
|
||||||
extern char* iconfig_path;
|
extern char* iconfig_path;
|
||||||
extern char* iconfig_common_path;
|
extern char* iconfig_common_path;
|
||||||
|
|
||||||
/* Ths is the optional -M<dependfile> value, if one was supplied. */
|
/* This is the optional -M<dependfile> value, if one was supplied. */
|
||||||
extern const char*depfile;
|
extern const char*depfile;
|
||||||
|
|
||||||
/* Ths is the optional -N<path> value, if one was supplied. */
|
/* This is the optional -N<path> value, if one was supplied. */
|
||||||
extern const char*npath;
|
extern const char*npath;
|
||||||
|
|
||||||
/* This is the name of the output file that the user selected. */
|
/* This is the name of the output file that the user selected. */
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ implies the synthesis \fB-S\fP flag.
|
||||||
|
|
||||||
.SH "WARNING TYPES"
|
.SH "WARNING TYPES"
|
||||||
These are the types of warnings that can be selected by the \fB-W\fP
|
These are the types of warnings that can be selected by the \fB-W\fP
|
||||||
switch. All the warning types (other then \fBall\fP) can also be
|
switch. All the warning types (other than \fBall\fP) can also be
|
||||||
prefixed with \fBno-\fP to turn off that warning. This is most useful
|
prefixed with \fBno-\fP to turn off that warning. This is most useful
|
||||||
after a \fB-Wall\fP argument to suppress isolated warning types.
|
after a \fB-Wall\fP argument to suppress isolated warning types.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ NetNet* PEConcat::elaborate_anet(Design*des, NetScope*scope) const
|
||||||
concat operator from least significant to most significant,
|
concat operator from least significant to most significant,
|
||||||
which is opposite from how they are given in the list.
|
which is opposite from how they are given in the list.
|
||||||
|
|
||||||
Allow for a repeat count other then 1 by repeating the
|
Allow for a repeat count other than 1 by repeating the
|
||||||
connect loop as many times as necessary. */
|
connect loop as many times as necessary. */
|
||||||
|
|
||||||
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
||||||
|
|
|
||||||
20
elab_net.cc
20
elab_net.cc
|
|
@ -192,7 +192,7 @@ NetNet* PEBinary::elaborate_net_add_(Design*des, NetScope*scope,
|
||||||
|
|
||||||
|
|
||||||
/* The owidth is the output width of the lpm_add_sub
|
/* The owidth is the output width of the lpm_add_sub
|
||||||
device. If the desired width is greater then the width of
|
device. If the desired width is greater than the width of
|
||||||
the operands, then widen the adder and let code below pad
|
the operands, then widen the adder and let code below pad
|
||||||
the operands. If this is an adder, we can take advantage of
|
the operands. If this is an adder, we can take advantage of
|
||||||
the carry bit. */
|
the carry bit. */
|
||||||
|
|
@ -735,7 +735,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
||||||
/*
|
/*
|
||||||
* Elaborate a divider gate. This function create a NetDivide gate
|
* Elaborate a divider gate. This function create a NetDivide gate
|
||||||
* which has exactly the right sized DataA, DataB and Result ports. If
|
* which has exactly the right sized DataA, DataB and Result ports. If
|
||||||
* the l-value is wider then the result, then pad.
|
* the l-value is wider than the result, then pad.
|
||||||
*/
|
*/
|
||||||
NetNet* PEBinary::elaborate_net_div_(Design*des, NetScope*scope,
|
NetNet* PEBinary::elaborate_net_div_(Design*des, NetScope*scope,
|
||||||
unsigned lwidth,
|
unsigned lwidth,
|
||||||
|
|
@ -789,7 +789,7 @@ NetNet* PEBinary::elaborate_net_div_(Design*des, NetScope*scope,
|
||||||
|
|
||||||
// Make an output signal that is the width of the l-value.
|
// Make an output signal that is the width of the l-value.
|
||||||
// Due to above calculation of rwidth, we know that the result
|
// Due to above calculation of rwidth, we know that the result
|
||||||
// will be no more then the l-value, so it is safe to connect
|
// will be no more than the l-value, so it is safe to connect
|
||||||
// all the result pins to the osig.
|
// all the result pins to the osig.
|
||||||
|
|
||||||
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
||||||
|
|
@ -801,7 +801,7 @@ NetNet* PEBinary::elaborate_net_div_(Design*des, NetScope*scope,
|
||||||
connect(div->pin_Result(idx), osig->pin(idx));
|
connect(div->pin_Result(idx), osig->pin(idx));
|
||||||
|
|
||||||
|
|
||||||
// If the lvalue is larger then the result, then pad the
|
// If the lvalue is larger than the result, then pad the
|
||||||
// output with constant 0. This can happen for example in
|
// output with constant 0. This can happen for example in
|
||||||
// cases like this:
|
// cases like this:
|
||||||
// wire [3;0] a, b;
|
// wire [3;0] a, b;
|
||||||
|
|
@ -859,7 +859,7 @@ NetNet* PEBinary::elaborate_net_mod_(Design*des, NetScope*scope,
|
||||||
for (unsigned idx = 0 ; idx < cnt ; idx += 1)
|
for (unsigned idx = 0 ; idx < cnt ; idx += 1)
|
||||||
connect(mod->pin_Result(idx), osig->pin(idx));
|
connect(mod->pin_Result(idx), osig->pin(idx));
|
||||||
|
|
||||||
/* If the lvalue is larger then the result, then pad the
|
/* If the lvalue is larger than the result, then pad the
|
||||||
output with constant 0. */
|
output with constant 0. */
|
||||||
if (cnt < osig->pin_count()) {
|
if (cnt < osig->pin_count()) {
|
||||||
NetConst*tmp = new NetConst(scope, scope->local_symbol(),
|
NetConst*tmp = new NetConst(scope, scope->local_symbol(),
|
||||||
|
|
@ -1030,7 +1030,7 @@ NetNet* PEBinary::elaborate_net_mul_(Design*des, NetScope*scope,
|
||||||
for (unsigned idx = 0 ; idx < cnt ; idx += 1)
|
for (unsigned idx = 0 ; idx < cnt ; idx += 1)
|
||||||
connect(mult->pin_Result(idx), osig->pin(idx));
|
connect(mult->pin_Result(idx), osig->pin(idx));
|
||||||
|
|
||||||
/* If the lvalue is larger then the result, then pad the
|
/* If the lvalue is larger than the result, then pad the
|
||||||
output with constant 0. */
|
output with constant 0. */
|
||||||
if (cnt < osig->pin_count()) {
|
if (cnt < osig->pin_count()) {
|
||||||
NetConst*tmp = new NetConst(scope, scope->local_symbol(),
|
NetConst*tmp = new NetConst(scope, scope->local_symbol(),
|
||||||
|
|
@ -1235,7 +1235,7 @@ NetNet* PECallFunction::elaborate_net(Design*des, NetScope*scope,
|
||||||
NetScope*dscope = def->scope();
|
NetScope*dscope = def->scope();
|
||||||
assert(dscope);
|
assert(dscope);
|
||||||
|
|
||||||
/* This must be a ufuction that returns a signal. */
|
/* This must be a function that returns a signal. */
|
||||||
assert(def->return_sig());
|
assert(def->return_sig());
|
||||||
|
|
||||||
/* check the validity of the parameters. */
|
/* check the validity of the parameters. */
|
||||||
|
|
@ -1418,7 +1418,7 @@ NetNet* PEConcat::elaborate_net(Design*des, NetScope*scope,
|
||||||
concat operator from least significant to most significant,
|
concat operator from least significant to most significant,
|
||||||
which is opposite from how they are given in the list.
|
which is opposite from how they are given in the list.
|
||||||
|
|
||||||
Allow for a repeat count other then 1 by repeating the
|
Allow for a repeat count other than 1 by repeating the
|
||||||
connect loop as many times as necessary. */
|
connect loop as many times as necessary. */
|
||||||
|
|
||||||
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
NetNet*osig = new NetNet(scope, scope->local_symbol(),
|
||||||
|
|
@ -1634,7 +1634,7 @@ NetNet* PEIdent::elaborate_net(Design*des, NetScope*scope,
|
||||||
with the sig type.
|
with the sig type.
|
||||||
|
|
||||||
Be careful to check the bit ordering. If the msb is
|
Be careful to check the bit ordering. If the msb is
|
||||||
less significant then the msb, then the source is
|
less significant than the msb, then the source is
|
||||||
broken. I can hack it in order to go on, but report
|
broken. I can hack it in order to go on, but report
|
||||||
an error. */
|
an error. */
|
||||||
|
|
||||||
|
|
@ -2273,7 +2273,7 @@ NetNet* PETernary::elaborate_net(Design*des, NetScope*scope,
|
||||||
assert(expr_sig->pin_count() == 1);
|
assert(expr_sig->pin_count() == 1);
|
||||||
|
|
||||||
/* This is the width of the LPM_MUX device that I'm about to
|
/* This is the width of the LPM_MUX device that I'm about to
|
||||||
create. It may be smaller then the desired output, but I'll
|
create. It may be smaller than the desired output, but I'll
|
||||||
handle padding below.
|
handle padding below.
|
||||||
|
|
||||||
Create a NetNet object wide enough to hold the
|
Create a NetNet object wide enough to hold the
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,7 @@ bool Module::elaborate_scope(Design*des, NetScope*scope) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan through all the named events in this scope. We do not
|
// Scan through all the named events in this scope. We do not
|
||||||
// need anything more then the current scope to do this
|
// need anything more than the current scope to do this
|
||||||
// elaboration, so do it now. This allows for normal
|
// elaboration, so do it now. This allows for normal
|
||||||
// elaboration to reference these events.
|
// elaboration to reference these events.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ void PGAssign::elaborate(Design*des, NetScope*scope) const
|
||||||
assert(lval && rval);
|
assert(lval && rval);
|
||||||
|
|
||||||
|
|
||||||
/* If the r-value insists on being smaller then the l-value
|
/* If the r-value insists on being smaller than the l-value
|
||||||
(perhaps it is explicitly sized) the pad it out to be the
|
(perhaps it is explicitly sized) the pad it out to be the
|
||||||
right width so that something is connected to all the bits
|
right width so that something is connected to all the bits
|
||||||
of the l-value. */
|
of the l-value. */
|
||||||
|
|
@ -286,7 +286,7 @@ void PGBuiltin::elaborate(Design*des, NetScope*scope) const
|
||||||
name = scope->local_symbol();
|
name = scope->local_symbol();
|
||||||
|
|
||||||
/* If the Verilog source has a range specification for the
|
/* If the Verilog source has a range specification for the
|
||||||
gates, then I am expected to make more then one
|
gates, then I am expected to make more than one
|
||||||
gate. Figure out how many are desired. */
|
gate. Figure out how many are desired. */
|
||||||
if (msb_) {
|
if (msb_) {
|
||||||
NetExpr*msb_exp = elab_and_eval(des, scope, msb_);
|
NetExpr*msb_exp = elab_and_eval(des, scope, msb_);
|
||||||
|
|
@ -1640,7 +1640,7 @@ NetProc* PCondit::elaborate(Design*des, NetScope*scope) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the condition expression is more then 1 bits, then
|
// If the condition expression is more than 1 bits, then
|
||||||
// generate a comparison operator to get the result down to
|
// generate a comparison operator to get the result down to
|
||||||
// one bit. Turn <e> into <e> != 0;
|
// one bit. Turn <e> into <e> != 0;
|
||||||
|
|
||||||
|
|
@ -2260,7 +2260,7 @@ NetProc* PEventStatement::elaborate_wait(Design*des, NetScope*scope,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the condition expression is more then 1 bits, then
|
// If the condition expression is more than 1 bits, then
|
||||||
// generate a reduction operator to get the result down to
|
// generate a reduction operator to get the result down to
|
||||||
// one bit. In other words, Turn <e> into |<e>;
|
// one bit. In other words, Turn <e> into |<e>;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -686,7 +686,7 @@ NetEConst* NetEBComp::eval_tree()
|
||||||
case '<': // Less than
|
case '<': // Less than
|
||||||
return eval_less_();
|
return eval_less_();
|
||||||
|
|
||||||
case '>': // Greater then
|
case '>': // Greater than
|
||||||
return eval_gt_();
|
return eval_gt_();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
* iverilog -tpal -ppart=generic-22v10-plcc -opal_reg.jed pal_reg.v
|
* iverilog -tpal -ppart=generic-22v10-plcc -opal_reg.jed pal_reg.v
|
||||||
*
|
*
|
||||||
* The output file name (passed through the -o<file> switch) can be
|
* The output file name (passed through the -o<file> switch) can be
|
||||||
* any file you desire. If the compilation and fittin all succeed, the
|
* any file you desire. If the compilation and fitting all succeed, the
|
||||||
* output file will be a JEDEC file that you can take to your favorite
|
* output file will be a JEDEC file that you can take to your favorite
|
||||||
* PROM programmer to program the part.
|
* PROM programmer to program the part.
|
||||||
*
|
*
|
||||||
|
|
@ -45,7 +45,7 @@
|
||||||
*
|
*
|
||||||
* The output drivers are controlled by a single active low output
|
* The output drivers are controlled by a single active low output
|
||||||
* enable. I used bufif0 devices in this example, but the exact same
|
* enable. I used bufif0 devices in this example, but the exact same
|
||||||
* thing can be achived with a continuous assignment like so:
|
* thing can be achieved with a continuous assignment like so:
|
||||||
*
|
*
|
||||||
* assign out = oe? 8'hzz : Q;
|
* assign out = oe? 8'hzz : Q;
|
||||||
*
|
*
|
||||||
|
|
@ -76,7 +76,7 @@ endmodule
|
||||||
* a PLCC package.
|
* a PLCC package.
|
||||||
*
|
*
|
||||||
* Note that this module has no logic in it. It is a convention I use
|
* Note that this module has no logic in it. It is a convention I use
|
||||||
* that I put all the functionality in a seperate module (seen above)
|
* that I put all the functionality in a separate module (seen above)
|
||||||
* and isolate the Icarus Verilog specific $attribute madness into a
|
* and isolate the Icarus Verilog specific $attribute madness into a
|
||||||
* top-level module. The advantage of this style is that the entire
|
* top-level module. The advantage of this style is that the entire
|
||||||
* module can be `ifdef'ed out when doing simulation and you don't
|
* module can be `ifdef'ed out when doing simulation and you don't
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@
|
||||||
*
|
*
|
||||||
* The $dumpvars task tells the simulation what variables to write to
|
* The $dumpvars task tells the simulation what variables to write to
|
||||||
* the VCD output. The first parameter is how far to descend while
|
* the VCD output. The first parameter is how far to descend while
|
||||||
* scanning a scope, and the remaining paramters are signals or scope
|
* scanning a scope, and the remaining parameters are signals or scope
|
||||||
* names to include in the dump. If a scope name is given, all the
|
* names to include in the dump. If a scope name is given, all the
|
||||||
* signals within the scope are dumped. If a wire or register name is
|
* signals within the scope are dumped. If a wire or register name is
|
||||||
* given, that signal is included.
|
* given, that signal is included.
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This module is a synthesizeable square-root function. It is also a
|
* This module is a synthesizable square-root function. It is also a
|
||||||
* detailed example of how to target Xilinx Virtex parts using
|
* detailed example of how to target Xilinx Virtex parts using
|
||||||
* Icarus Verilog. In fact, for no particular reason other than to
|
* Icarus Verilog. In fact, for no particular reason other than to
|
||||||
* be excessively specific, I will step through the process of
|
* be excessively specific, I will step through the process of
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
* In addition to Icarus Verilog, you will need implementation
|
* In addition to Icarus Verilog, you will need implementation
|
||||||
* software from Xilinx. As of this writing, this example was tested
|
* software from Xilinx. As of this writing, this example was tested
|
||||||
* with Foundation 4.2i, but it should work the same with ISE and
|
* with Foundation 4.2i, but it should work the same with ISE and
|
||||||
* Webpack software.
|
* WebPACK software.
|
||||||
*
|
*
|
||||||
* This example source contains all the Verilog needed to do
|
* This example source contains all the Verilog needed to do
|
||||||
* everything described below. We use conditional compilation to
|
* everything described below. We use conditional compilation to
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
* "PASSED" and finishes the simulation.
|
* "PASSED" and finishes the simulation.
|
||||||
*
|
*
|
||||||
* When you take a close look at the "main" module below, you will see
|
* When you take a close look at the "main" module below, you will see
|
||||||
* that it uses Verilog constructs that are not synthesizeable. This
|
* that it uses Verilog constructs that are not synthesizable. This
|
||||||
* is fine, as we will never try to synthesize it.
|
* is fine, as we will never try to synthesize it.
|
||||||
*
|
*
|
||||||
* LIBRARY PARTS
|
* LIBRARY PARTS
|
||||||
|
|
@ -78,7 +78,7 @@
|
||||||
* Without any preprocessor directives, the only module is the sqrt32
|
* Without any preprocessor directives, the only module is the sqrt32
|
||||||
* module, so sqrt32 is compiled as the root. The ports of the module
|
* module, so sqrt32 is compiled as the root. The ports of the module
|
||||||
* are automatically made into ports of the sqrt32.edf netlist, and
|
* are automatically made into ports of the sqrt32.edf netlist, and
|
||||||
* the contents of the sqrt32 module are connected approprately.
|
* the contents of the sqrt32 module are connected appropriately.
|
||||||
*
|
*
|
||||||
* COMPLETE CHIP DESIGNS
|
* COMPLETE CHIP DESIGNS
|
||||||
*
|
*
|
||||||
|
|
@ -154,7 +154,7 @@
|
||||||
*
|
*
|
||||||
* The POST_MAP compiler directive causes the GSR manipulations
|
* The POST_MAP compiler directive causes the GSR manipulations
|
||||||
* included in the test bench to be compiled in, to simulate the chip
|
* included in the test bench to be compiled in, to simulate the chip
|
||||||
* startup. Other then that, the test bench runs the post-map design
|
* startup. Other than that, the test bench runs the post-map design
|
||||||
* the same way the pre-synthesis design works.
|
* the same way the pre-synthesis design works.
|
||||||
*
|
*
|
||||||
* Run this design with the command:
|
* Run this design with the command:
|
||||||
|
|
@ -183,7 +183,7 @@
|
||||||
* where sqrt(y) is the exact square root of y and floor(N) is the
|
* where sqrt(y) is the exact square root of y and floor(N) is the
|
||||||
* largest integer <= N.
|
* largest integer <= N.
|
||||||
*
|
*
|
||||||
* For 32bit numbers, this will never run more then 16 iterations,
|
* For 32bit numbers, this will never run more than 16 iterations,
|
||||||
* which amounts to 16 clocks.
|
* which amounts to 16 clocks.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
* where sqrt(y) is the exact square root of y and floor(N) is the
|
* where sqrt(y) is the exact square root of y and floor(N) is the
|
||||||
* largest integer <= N.
|
* largest integer <= N.
|
||||||
*
|
*
|
||||||
* For 32bit numbers, this will never run more then 16 iterations,
|
* For 32bit numbers, this will never run more than 16 iterations,
|
||||||
* which amounts to 16 clocks.
|
* which amounts to 16 clocks.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -249,7 +249,7 @@ exactly the same so far as the compiler is concerned.
|
||||||
|
|
||||||
Unfortunately, Cadence seems to feel otherwise. In particular, it has
|
Unfortunately, Cadence seems to feel otherwise. In particular, it has
|
||||||
been reported that although {1'b0, 16} causes an error, {1'b0, 15+1}
|
been reported that although {1'b0, 16} causes an error, {1'b0, 15+1}
|
||||||
is accepted. Further testing shows that any expression other then a
|
is accepted. Further testing shows that any expression other than a
|
||||||
simple unsized constant is accepted there, even if all the operands of
|
simple unsized constant is accepted there, even if all the operands of
|
||||||
all the operators that make up the expression are unsized integers.
|
all the operators that make up the expression are unsized integers.
|
||||||
|
|
||||||
|
|
@ -282,12 +282,12 @@ One might note that the quote from section 4.1.14 says "Unsized
|
||||||
expressions...", so arguably accepting (15+1) or even (16+0) as an
|
expressions...", so arguably accepting (15+1) or even (16+0) as an
|
||||||
operand to a concatenation is not a violation of the letter of the
|
operand to a concatenation is not a violation of the letter of the
|
||||||
law. However, the very next sentence of the quote expresses the
|
law. However, the very next sentence of the quote expresses the
|
||||||
intent, and accepting (15+1) as having a more defined size then (16)
|
intent, and accepting (15+1) as having a more defined size than (16)
|
||||||
seems to be a violation of that intent.
|
seems to be a violation of that intent.
|
||||||
|
|
||||||
Whatever a compiler decides the size is, the user has no way to
|
Whatever a compiler decides the size is, the user has no way to
|
||||||
predict it, and the compiler should not have the right to treat (15+1)
|
predict it, and the compiler should not have the right to treat (15+1)
|
||||||
any differently then (16). Therefore, Icarus Verilog takes the
|
any differently than (16). Therefore, Icarus Verilog takes the
|
||||||
position that such expressions are *unsized* and are not allowed as
|
position that such expressions are *unsized* and are not allowed as
|
||||||
operands to concatenations. Icarus Verilog will in general assume that
|
operands to concatenations. Icarus Verilog will in general assume that
|
||||||
operations on unsized numbers produce unsized results. There are
|
operations on unsized numbers produce unsized results. There are
|
||||||
|
|
|
||||||
|
|
@ -650,7 +650,7 @@ extern const char* ivl_udp_name(ivl_udp_t net);
|
||||||
* ivl_lpm_decode
|
* ivl_lpm_decode
|
||||||
* Return the DECODER associated with this LPM_FF device. The
|
* Return the DECODER associated with this LPM_FF device. The
|
||||||
* decoder for a FF takes an input address and generates an enable
|
* decoder for a FF takes an input address and generates an enable
|
||||||
* input for no more then 1 bit (can be none) of the FF device.
|
* input for no more than 1 bit (can be none) of the FF device.
|
||||||
*
|
*
|
||||||
* ivl_lpm_q
|
* ivl_lpm_q
|
||||||
* Return the output data nexus for device types that have a single
|
* Return the output data nexus for device types that have a single
|
||||||
|
|
@ -985,7 +985,7 @@ extern ivl_expr_t ivl_parameter_expr(ivl_parameter_t net);
|
||||||
* ivl_scope_children
|
* ivl_scope_children
|
||||||
* A scope may in turn contain other scopes. This method iterates
|
* A scope may in turn contain other scopes. This method iterates
|
||||||
* through all the child scopes of a given scope. If the function
|
* through all the child scopes of a given scope. If the function
|
||||||
* returns any value other then 0, the iteration stops and the
|
* returns any value other than 0, the iteration stops and the
|
||||||
* method returns that value. Otherwise, iteration continues until
|
* method returns that value. Otherwise, iteration continues until
|
||||||
* the children run out.
|
* the children run out.
|
||||||
*
|
*
|
||||||
|
|
@ -1212,7 +1212,7 @@ extern ivl_statement_type_t ivl_statement_type(ivl_statement_t net);
|
||||||
/*
|
/*
|
||||||
* The following functions retrieve specific single values from the
|
* The following functions retrieve specific single values from the
|
||||||
* statement. These values are the bits of data and parameters that
|
* statement. These values are the bits of data and parameters that
|
||||||
* make up the statement. Many of these functions apply to more then
|
* make up the statement. Many of these functions apply to more than
|
||||||
* one type of statement, so the comment in front of them tells which
|
* one type of statement, so the comment in front of them tells which
|
||||||
* statement types can be passed to the function.
|
* statement types can be passed to the function.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -593,7 +593,7 @@ static void do_define()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Detect the continuation sequence. If I find it, remove it
|
/* Detect the continuation sequence. If I find it, remove it
|
||||||
and the white space that preceeds it, then replace all that
|
and the white space that precedes it, then replace all that
|
||||||
with a single newline. */
|
with a single newline. */
|
||||||
if ((cp > yytext) && (cp[-1] == '\\')) {
|
if ((cp > yytext) && (cp[-1] == '\\')) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -681,7 +681,7 @@ static verinum*make_unsized_dec(const char*ptr)
|
||||||
if (ptr[0] == '\'') {
|
if (ptr[0] == '\'') {
|
||||||
/* The number has decorations of the form 'sd<digits>,
|
/* The number has decorations of the form 'sd<digits>,
|
||||||
possibly with space between the d and the <digits>.
|
possibly with space between the d and the <digits>.
|
||||||
Also, the 's' is optional, and markes the number as
|
Also, the 's' is optional, and marks the number as
|
||||||
signed. */
|
signed. */
|
||||||
ptr += 1;
|
ptr += 1;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ handle acc_next(PLI_INT32 *type, handle scope, handle prev)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The acc_next_* functions need to be reentrant, so we need to
|
* The acc_next_* functions need to be reentrant, so we need to
|
||||||
* rescan all the items upto the previous one, then return
|
* rescan all the items up to the previous one, then return
|
||||||
* the next one.
|
* the next one.
|
||||||
*/
|
*/
|
||||||
iter = vpi_iterate(vpiScope, scope); // ICARUS extension
|
iter = vpi_iterate(vpiScope, scope); // ICARUS extension
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
#include <acc_user.h>
|
#include <acc_user.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tf_getinstance implemented using equvalent acc_ routing
|
* tf_getinstance implemented using equivalent acc_ routing
|
||||||
*/
|
*/
|
||||||
char *tf_getcstringp(int n)
|
char *tf_getcstringp(int n)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
extern char* __acc_newstring(const char*txt);
|
extern char* __acc_newstring(const char*txt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Trace file for loggint ACC and TF calls.
|
* Trace file for logging ACC and TF calls.
|
||||||
*/
|
*/
|
||||||
FILE* pli_trace;
|
FILE* pli_trace;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Contains the routines required to implement veriusertfs routines
|
* Contains the routines required to implement veriusertfs routines
|
||||||
* via VPI. This is extremly ugly, so don't look after eating dinner.
|
* via VPI. This is extremely ugly, so don't look after eating dinner.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
|
|
|
||||||
2
main.cc
2
main.cc
|
|
@ -662,7 +662,7 @@ int main(int argc, char*argv[])
|
||||||
|
|
||||||
des->set_flags(flags);
|
des->set_flags(flags);
|
||||||
|
|
||||||
/* Done iwth all the pform data. Delete the modules. */
|
/* Done with all the pform data. Delete the modules. */
|
||||||
for (map<perm_string,Module*>::iterator idx = pform_modules.begin()
|
for (map<perm_string,Module*>::iterator idx = pform_modules.begin()
|
||||||
; idx != pform_modules.end() ; idx ++) {
|
; idx != pform_modules.end() ; idx ++) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ The msys package is available from the mingw download site. This is
|
||||||
not the compiler but a collection of *nix tools ported to Windows and
|
not the compiler but a collection of *nix tools ported to Windows and
|
||||||
wrapped in a convenient installer. The msys package is all the various
|
wrapped in a convenient installer. The msys package is all the various
|
||||||
basic tools (shells, file utils, etc) and the msysDTK is extra
|
basic tools (shells, file utils, etc) and the msysDTK is extra
|
||||||
developer tools other then the compiler.
|
developer tools other than the compiler.
|
||||||
|
|
||||||
Download the msys-1.x.x.exe and msysdtc-1.x.x.exe binaries. These are
|
Download the msys-1.x.x.exe and msysdtc-1.x.x.exe binaries. These are
|
||||||
self-installing packages. Install msys first, and then msysDTC. Most
|
self-installing packages. Install msys first, and then msysDTC. Most
|
||||||
|
|
@ -91,7 +91,7 @@ commands below.
|
||||||
The obvious step 2, then, is install the mingw compilers. These can be
|
The obvious step 2, then, is install the mingw compilers. These can be
|
||||||
found at the web page <http://www.mingw.org>. The Mingw-5.x.x package
|
found at the web page <http://www.mingw.org>. The Mingw-5.x.x package
|
||||||
is a convenient remote installer. Download this program and run
|
is a convenient remote installer. Download this program and run
|
||||||
it. The installer will ask wich components you want to install. You
|
it. The installer will ask which components you want to install. You
|
||||||
need only the base C compiler and the C++ compiler. (You may install
|
need only the base C compiler and the C++ compiler. (You may install
|
||||||
other languages if you wish.)
|
other languages if you wish.)
|
||||||
|
|
||||||
|
|
@ -150,7 +150,7 @@ You will need these gnuwin32 packages to compile Icarus Verilog:
|
||||||
I suggest creating a common directory for holding all your gnuwin32
|
I suggest creating a common directory for holding all your gnuwin32
|
||||||
packages. I use C:\gnuwin32. The download page at the gnuwin32 site
|
packages. I use C:\gnuwin32. The download page at the gnuwin32 site
|
||||||
has a "setup" link for each of these packages. Click the setup to
|
has a "setup" link for each of these packages. Click the setup to
|
||||||
download the installer for each of the desired programes, then execute
|
download the installer for each of the desired programs, then execute
|
||||||
the downloaded .exe files to invoke the installer. Install into the
|
the downloaded .exe files to invoke the installer. Install into the
|
||||||
c:\gunwin32 directory.
|
c:\gunwin32 directory.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,7 @@ NexusSet* NetAssignBase::nex_input(bool rem_out)
|
||||||
{
|
{
|
||||||
NexusSet*result = rval_->nex_input(rem_out);
|
NexusSet*result = rval_->nex_input(rem_out);
|
||||||
|
|
||||||
/* It is possible that the lval_ can hav nex_input values. In
|
/* It is possible that the lval_ can have nex_input values. In
|
||||||
particular, index expressions are statement inputs as well,
|
particular, index expressions are statement inputs as well,
|
||||||
so should be addressed here. */
|
so should be addressed here. */
|
||||||
for (NetAssign_*cur = lval_ ; cur ; cur = cur->more) {
|
for (NetAssign_*cur = lval_ ; cur ; cur = cur->more) {
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ void NetPDelay::nex_output(NexusSet&out)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For the purposes of synthesis, system task calls have no output at
|
* For the purposes of synthesis, system task calls have no output at
|
||||||
* all. This is OK because most system tasks are not synthesizeable in
|
* all. This is OK because most system tasks are not synthesizable in
|
||||||
* the first place.
|
* the first place.
|
||||||
*/
|
*/
|
||||||
void NetSTask::nex_output(NexusSet&out)
|
void NetSTask::nex_output(NexusSet&out)
|
||||||
|
|
|
||||||
18
netlist.h
18
netlist.h
|
|
@ -548,7 +548,7 @@ class NetCLShift : public NetNode {
|
||||||
* This class supports the LPM_COMPARE device.
|
* This class supports the LPM_COMPARE device.
|
||||||
*
|
*
|
||||||
* The width of the device is the width of the inputs. If one of the
|
* The width of the device is the width of the inputs. If one of the
|
||||||
* inputs is narrower then the other, it is up to the generator to
|
* inputs is narrower than the other, it is up to the generator to
|
||||||
* make sure all the data pins are properly driven.
|
* make sure all the data pins are properly driven.
|
||||||
*
|
*
|
||||||
* NOTE: This is not the same as the device used to support case
|
* NOTE: This is not the same as the device used to support case
|
||||||
|
|
@ -919,7 +919,7 @@ class NetMemory {
|
||||||
* EDIF LPM Version 2 1 0 standard. It is used as a structural
|
* EDIF LPM Version 2 1 0 standard. It is used as a structural
|
||||||
* implementation of the * operator. The device has inputs DataA and
|
* implementation of the * operator. The device has inputs DataA and
|
||||||
* DataB that can have independent widths, as can the result. If the
|
* DataB that can have independent widths, as can the result. If the
|
||||||
* result is smaller then the widths of a and b together, then the
|
* result is smaller than the widths of a and b together, then the
|
||||||
* device drops the least significant bits of the product.
|
* device drops the least significant bits of the product.
|
||||||
*/
|
*/
|
||||||
class NetMult : public NetNode {
|
class NetMult : public NetNode {
|
||||||
|
|
@ -1389,7 +1389,7 @@ class NetLogic : public NetNode {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The UDP is a User Defined Primitive from the Verilog source. Do not
|
* The UDP is a User Defined Primitive from the Verilog source. Do not
|
||||||
* expand it out any further then this in the netlist, as this can be
|
* expand it out any further than this in the netlist, as this can be
|
||||||
* used to represent target device primitives.
|
* used to represent target device primitives.
|
||||||
*
|
*
|
||||||
* The UDP can be combinational or sequential. The sequential UDP
|
* The UDP can be combinational or sequential. The sequential UDP
|
||||||
|
|
@ -1411,7 +1411,7 @@ class NetLogic : public NetNode {
|
||||||
* N -- (1x)
|
* N -- (1x)
|
||||||
*
|
*
|
||||||
* It also takes one of the following glob letters to represent more
|
* It also takes one of the following glob letters to represent more
|
||||||
* then one item.
|
* than one item.
|
||||||
*
|
*
|
||||||
* p -- 01, 0x or x1 // check this with the lexer
|
* p -- 01, 0x or x1 // check this with the lexer
|
||||||
* n -- 10, 1x or x0 // check this with the lexer
|
* n -- 10, 1x or x0 // check this with the lexer
|
||||||
|
|
@ -1424,7 +1424,7 @@ class NetLogic : public NetNode {
|
||||||
* SEQUENTIAL
|
* SEQUENTIAL
|
||||||
* These objects have a single bit of memory. The logic table includes
|
* These objects have a single bit of memory. The logic table includes
|
||||||
* an entry for the current value, and allows edges on the inputs. In
|
* an entry for the current value, and allows edges on the inputs. In
|
||||||
* canonical form, inly then entries that generate 0, 1 or - (no change)
|
* canonical form, only the entries that generate 0, 1 or - (no change)
|
||||||
* are listed.
|
* are listed.
|
||||||
*
|
*
|
||||||
* COMBINATIONAL
|
* COMBINATIONAL
|
||||||
|
|
@ -2596,8 +2596,8 @@ class NetProcTop : public LineInfo, public Attrib {
|
||||||
* % -- Arithmetic modulus
|
* % -- Arithmetic modulus
|
||||||
* & -- Bit-wise AND
|
* & -- Bit-wise AND
|
||||||
* | -- Bit-wise OR
|
* | -- Bit-wise OR
|
||||||
* < -- Less then
|
* < -- Less than
|
||||||
* > -- Greater then
|
* > -- Greater than
|
||||||
* e -- Logical equality (==)
|
* e -- Logical equality (==)
|
||||||
* E -- Case equality (===)
|
* E -- Case equality (===)
|
||||||
* L -- Less or equal
|
* L -- Less or equal
|
||||||
|
|
@ -2717,8 +2717,8 @@ class NetEBBits : public NetEBinary {
|
||||||
* this case the bit width of the expression is 1 bit, and the
|
* this case the bit width of the expression is 1 bit, and the
|
||||||
* operands take their natural widths. The supported operators are:
|
* operands take their natural widths. The supported operators are:
|
||||||
*
|
*
|
||||||
* < -- Less then
|
* < -- Less than
|
||||||
* > -- Greater then
|
* > -- Greater than
|
||||||
* e -- Logical equality (==)
|
* e -- Logical equality (==)
|
||||||
* E -- Case equality (===)
|
* E -- Case equality (===)
|
||||||
* L -- Less or equal (<=)
|
* L -- Less or equal (<=)
|
||||||
|
|
|
||||||
2
parse.y
2
parse.y
|
|
@ -1548,7 +1548,7 @@ module_port_list_opt
|
||||||
| { $$ = 0; }
|
| { $$ = 0; }
|
||||||
;
|
;
|
||||||
|
|
||||||
/* Module declarations include optional ANSII style module parameter
|
/* Module declarations include optional ANSI style module parameter
|
||||||
ports. These are simply advance ways to declare parameters, so
|
ports. These are simply advance ways to declare parameters, so
|
||||||
that the port declarations may use them. */
|
that the port declarations may use them. */
|
||||||
module_parameter_port_list_opt
|
module_parameter_port_list_opt
|
||||||
|
|
|
||||||
2
pform.cc
2
pform.cc
|
|
@ -365,7 +365,7 @@ static void process_udp_table(PUdp*udp, list<string>*table,
|
||||||
placed in the PUdp object.
|
placed in the PUdp object.
|
||||||
|
|
||||||
The table strings are made up by the parser to be two or
|
The table strings are made up by the parser to be two or
|
||||||
three substrings seperated by ';', i.e.:
|
three substrings separated by ';', i.e.:
|
||||||
|
|
||||||
0101:1:1 (synchronous device entry)
|
0101:1:1 (synchronous device entry)
|
||||||
0101:0 (combinational device entry)
|
0101:0 (combinational device entry)
|
||||||
|
|
|
||||||
|
|
@ -871,7 +871,7 @@ bool NetCase::synth_async(Design*des, NetScope*scope, bool sync_flag,
|
||||||
|
|
||||||
/* If after all this is an unspecified case, then get the
|
/* If after all this is an unspecified case, then get the
|
||||||
input from the synchronous output. Note that we know
|
input from the synchronous output. Note that we know
|
||||||
by design that there is no relevent default or accum
|
by design that there is no relevant default or accum
|
||||||
input to use here, as those cases are handled above. */
|
input to use here, as those cases are handled above. */
|
||||||
if (statement_map[item] == 0) {
|
if (statement_map[item] == 0) {
|
||||||
|
|
||||||
|
|
@ -2076,7 +2076,7 @@ bool NetCondit::synth_sync(Design*des, NetScope*scope,
|
||||||
|
|
||||||
/* XXXX I really should find a way to check that the
|
/* XXXX I really should find a way to check that the
|
||||||
edge used on the reset input is correct. This would
|
edge used on the reset input is correct. This would
|
||||||
involve interpreting the exression that is fed by the
|
involve interpreting the expression that is fed by the
|
||||||
reset expression. */
|
reset expression. */
|
||||||
//assert(ev->edge() == NetEvProbe::POSEDGE);
|
//assert(ev->edge() == NetEvProbe::POSEDGE);
|
||||||
|
|
||||||
|
|
@ -2231,7 +2231,7 @@ bool NetCondit::synth_sync(Design*des, NetScope*scope,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Detect the case that this is a *synchronous* set/reset. It
|
/* Detect the case that this is a *synchronous* set/reset. It
|
||||||
is not asyncronous because we know the condition is not
|
is not asynchronous because we know the condition is not
|
||||||
included in the sensitivity list, but if the if_ case is
|
included in the sensitivity list, but if the if_ case is
|
||||||
constant (has no inputs) then we can model this as a
|
constant (has no inputs) then we can model this as a
|
||||||
synchronous set/reset.
|
synchronous set/reset.
|
||||||
|
|
@ -2402,7 +2402,7 @@ bool NetEvWait::synth_sync(Design*des, NetScope*scope,
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This can't be other then one unless there are named events,
|
/* This can't be other than one unless there are named events,
|
||||||
which I cannot synthesize. */
|
which I cannot synthesize. */
|
||||||
assert(nevents_ == 1);
|
assert(nevents_ == 1);
|
||||||
NetEvent*ev = events_[0];
|
NetEvent*ev = events_[0];
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ struct device_s {
|
||||||
* Return the device_t cookie given the name of the architecture. If
|
* Return the device_t cookie given the name of the architecture. If
|
||||||
* the device is not found, return 0.
|
* the device is not found, return 0.
|
||||||
*
|
*
|
||||||
* This function is used if the user specifies the archetecture
|
* This function is used if the user specifies the architecture
|
||||||
* explicitly, with the -parch=name flag.
|
* explicitly, with the -parch=name flag.
|
||||||
*/
|
*/
|
||||||
extern device_t device_from_arch(const char*arch);
|
extern device_t device_from_arch(const char*arch);
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ struct device_s {
|
||||||
* Return the device_t cookie given the name of the architecture. If
|
* Return the device_t cookie given the name of the architecture. If
|
||||||
* the device is not found, return 0.
|
* the device is not found, return 0.
|
||||||
*
|
*
|
||||||
* This function is used if the user specifies the archetecture
|
* This function is used if the user specifies the architecture
|
||||||
* explicitly, with the -parch=name flag.
|
* explicitly, with the -parch=name flag.
|
||||||
*/
|
*/
|
||||||
extern device_t device_from_arch(const char*arch);
|
extern device_t device_from_arch(const char*arch);
|
||||||
|
|
|
||||||
|
|
@ -160,7 +160,7 @@ device pins are connected.
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
|
|
||||||
.TB 8
|
.TB 8
|
||||||
.I COMPILING WITH XILINX FOUNDATION/iSE
|
.I COMPILING WITH XILINX FOUNDATION/ISE
|
||||||
Compile a single-file design with command line tools like so:
|
Compile a single-file design with command line tools like so:
|
||||||
|
|
||||||
.nf
|
.nf
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ unsigned long verinum::as_ulong() const
|
||||||
*
|
*
|
||||||
* If the value is undefined, return 0.
|
* If the value is undefined, return 0.
|
||||||
*
|
*
|
||||||
* This function presumes that the native format is 2s compliment
|
* This function presumes that the native format is 2s complement
|
||||||
* (pretty safe these days) and masks/sets bits accordingly. If the
|
* (pretty safe these days) and masks/sets bits accordingly. If the
|
||||||
* value is too large for the native form, it truncates the high bits.
|
* value is too large for the native form, it truncates the high bits.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -279,7 +279,7 @@ struct lxt2_wr_symbol * lxt2_wr_symbol_add(struct lxt2_wr_trace *lt, const char
|
||||||
struct lxt2_wr_symbol * lxt2_wr_symbol_alias(struct lxt2_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb);
|
struct lxt2_wr_symbol * lxt2_wr_symbol_alias(struct lxt2_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb);
|
||||||
void lxt2_wr_symbol_bracket_stripping(struct lxt2_wr_trace *lt, int doit);
|
void lxt2_wr_symbol_bracket_stripping(struct lxt2_wr_trace *lt, int doit);
|
||||||
|
|
||||||
/* each granule is LXT2_WR_GRANULE_SIZE (32 or 64) timesteps, default is 256 per section */
|
/* each granule is LXT2_WR_GRANULE_SIZE (32 or 64) time steps, default is 256 per section */
|
||||||
void lxt2_wr_set_maxgranule(struct lxt2_wr_trace *lt, unsigned int maxgranule);
|
void lxt2_wr_set_maxgranule(struct lxt2_wr_trace *lt, unsigned int maxgranule);
|
||||||
|
|
||||||
/* time ops */
|
/* time ops */
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,7 @@ static void format_time(unsigned mcd, int fsize,
|
||||||
|
|
||||||
/* This is the number of characters to the right of the
|
/* This is the number of characters to the right of the
|
||||||
decimal point. This is defined completely by the
|
decimal point. This is defined completely by the
|
||||||
timeformat. It is legal for the precision to be larger then
|
timeformat. It is legal for the precision to be larger than
|
||||||
the units, and in this case there will be no fraction_chars
|
the units, and in this case there will be no fraction_chars
|
||||||
at all. */
|
at all. */
|
||||||
fraction_chars = timeformat_info.units - format_precision;
|
fraction_chars = timeformat_info.units - format_precision;
|
||||||
|
|
@ -193,7 +193,7 @@ static void format_time(unsigned mcd, int fsize,
|
||||||
|
|
||||||
/* This is the number of zeros I must add to the value to get
|
/* This is the number of zeros I must add to the value to get
|
||||||
the desired precision within the fraction. If this value is
|
the desired precision within the fraction. If this value is
|
||||||
greater then 0, the value does not have enough characters,
|
greater than 0, the value does not have enough characters,
|
||||||
so I will be adding zeros. */
|
so I will be adding zeros. */
|
||||||
|
|
||||||
fraction_pad = time_units - format_precision;
|
fraction_pad = time_units - format_precision;
|
||||||
|
|
@ -213,7 +213,7 @@ static void format_time(unsigned mcd, int fsize,
|
||||||
/* This is the number of zeros that I must add to the integer
|
/* This is the number of zeros that I must add to the integer
|
||||||
part of the output string to pad the value out to the
|
part of the output string to pad the value out to the
|
||||||
desired units. This will only have a non-zero value if the
|
desired units. This will only have a non-zero value if the
|
||||||
units of the value is greater then the desired units.
|
units of the value is greater than the desired units.
|
||||||
|
|
||||||
Detect the special case where the value is 0. In this case,
|
Detect the special case where the value is 0. In this case,
|
||||||
do not do any integer filling ever. The output should be
|
do not do any integer filling ever. The output should be
|
||||||
|
|
@ -1117,7 +1117,7 @@ static PLI_INT32 sys_monitor_calltf(char*name)
|
||||||
vpiHandle scope = vpi_handle(vpiScope, sys);
|
vpiHandle scope = vpi_handle(vpiScope, sys);
|
||||||
vpiHandle argv = vpi_iterate(vpiArgument, sys);
|
vpiHandle argv = vpi_iterate(vpiArgument, sys);
|
||||||
|
|
||||||
/* If there was a previous $monitor, then remove the calbacks
|
/* If there was a previous $monitor, then remove the callbacks
|
||||||
related to it. */
|
related to it. */
|
||||||
if (monitor_callbacks) {
|
if (monitor_callbacks) {
|
||||||
for (idx = 0 ; idx < monitor_info.nitems ; idx += 1)
|
for (idx = 0 ; idx < monitor_info.nitems ; idx += 1)
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file contains the implementations of the VCD related
|
* This file contains the implementations of the VCD related
|
||||||
* funcitons.
|
* functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
# include "vpi_user.h"
|
# include "vpi_user.h"
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file contains the implementations of the VCD related
|
* This file contains the implementations of the VCD related
|
||||||
* funcitons.
|
* functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
# include "vpi_user.h"
|
# include "vpi_user.h"
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ long rtl_dist_poisson(long*seed, long mean)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copied from IEEE1364-2001, with slight midifications for 64bit machines. */
|
/* copied from IEEE1364-2001, with slight modifications for 64bit machines. */
|
||||||
long rtl_dist_uniform(long*seed, long start, long end)
|
long rtl_dist_uniform(long*seed, long start, long end)
|
||||||
{
|
{
|
||||||
double r;
|
double r;
|
||||||
|
|
@ -175,7 +175,7 @@ static double uniform(long *seed, long start, long end )
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copied from IEEE1364-2001, with slight midifications for 64bit machines. */
|
/* copied from IEEE1364-2001, with slight modifications for 64bit machines. */
|
||||||
static long poisson(long*seed, long mean)
|
static long poisson(long*seed, long mean)
|
||||||
{
|
{
|
||||||
long n;
|
long n;
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ static PLI_INT32 sys_mti_random_calltf(char*name)
|
||||||
context->mti = NP1;
|
context->mti = NP1;
|
||||||
assert(context);
|
assert(context);
|
||||||
|
|
||||||
/* squrrel away context */
|
/* squirrel away context */
|
||||||
vpi_put_userdata(call_handle, (void *)context);
|
vpi_put_userdata(call_handle, (void *)context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ static PLI_INT32 sys_readmem_calltf(char*name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get optional forth parameter. It must be a constant. */
|
/* Get optional fourth parameter. It must be a constant. */
|
||||||
stop_item = vpi_scan(argv);
|
stop_item = vpi_scan(argv);
|
||||||
if (stop_item!=0){
|
if (stop_item!=0){
|
||||||
if (check_integer_constant(name, stop_item) == 0){
|
if (check_integer_constant(name, stop_item) == 0){
|
||||||
|
|
@ -188,7 +188,7 @@ static PLI_INT32 sys_readmem_calltf(char*name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that ther is no 5th parameter */
|
/* Check that there is no 5th parameter */
|
||||||
if (vpi_scan(argv) != 0){
|
if (vpi_scan(argv) != 0){
|
||||||
vpi_printf("ERROR: %s accepts maximum 4 parameters!\n", name );
|
vpi_printf("ERROR: %s accepts maximum 4 parameters!\n", name );
|
||||||
vpi_free_object(argv);
|
vpi_free_object(argv);
|
||||||
|
|
@ -424,7 +424,7 @@ static PLI_INT32 sys_writemem_calltf(char*name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get optional forth parameter. It must be a constant. */
|
/* Get optional fourth parameter. It must be a constant. */
|
||||||
stop_item = vpi_scan(argv);
|
stop_item = vpi_scan(argv);
|
||||||
if (stop_item!=0){
|
if (stop_item!=0){
|
||||||
if (check_integer_constant(name, stop_item) == 0){
|
if (check_integer_constant(name, stop_item) == 0){
|
||||||
|
|
@ -432,7 +432,7 @@ static PLI_INT32 sys_writemem_calltf(char*name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that ther is no 5th parameter */
|
/* Check that there is no 5th parameter */
|
||||||
if (vpi_scan(argv) != 0){
|
if (vpi_scan(argv) != 0){
|
||||||
vpi_printf("ERROR: %s accepts maximum 4 parameters!\n", name );
|
vpi_printf("ERROR: %s accepts maximum 4 parameters!\n", name );
|
||||||
vpi_free_object(argv);
|
vpi_free_object(argv);
|
||||||
|
|
@ -450,7 +450,7 @@ static PLI_INT32 sys_writemem_calltf(char*name)
|
||||||
/* Open the data file. */
|
/* Open the data file. */
|
||||||
file = fopen(path, "w");
|
file = fopen(path, "w");
|
||||||
if (file == 0) {
|
if (file == 0) {
|
||||||
vpi_printf("%s: Unable to open %s for writeing.\n", name, path);
|
vpi_printf("%s: Unable to open %s for writing.\n", name, path);
|
||||||
free(path);
|
free(path);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file contains the implementations of the VCD related
|
* This file contains the implementations of the VCD related
|
||||||
* funcitons.
|
* functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
# include "vpi_user.h"
|
# include "vpi_user.h"
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ void vcd_names_sort(struct vcd_names_list_s*tab)
|
||||||
|
|
||||||
The new signal will be listed as a $var, but no callback
|
The new signal will be listed as a $var, but no callback
|
||||||
will be installed. This saves considerable CPU time and leads
|
will be installed. This saves considerable CPU time and leads
|
||||||
to smalle VCD files.
|
to smaller VCD files.
|
||||||
|
|
||||||
The _vpiNexusId is a private (int) property of IVL simulators.
|
The _vpiNexusId is a private (int) property of IVL simulators.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ vpip_bit_t vpip_pair_resolve(vpip_bit_t a, vpip_bit_t b)
|
||||||
res = tmp;
|
res = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cannonicalize the HiZ value. */
|
/* Canonicalize the HiZ value. */
|
||||||
if ((res&0x77) == 0)
|
if ((res&0x77) == 0)
|
||||||
res = HiZ;
|
res = HiZ;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ void vpip_run_value_changes(struct __vpiSignal*sig)
|
||||||
/*
|
/*
|
||||||
* Handle read-only synch events. This causes the callback to be
|
* Handle read-only synch events. This causes the callback to be
|
||||||
* scheduled for a moment at the end of the time period. This method
|
* scheduled for a moment at the end of the time period. This method
|
||||||
* handles scheduling with itme delays.
|
* handles scheduling with time delays.
|
||||||
*/
|
*/
|
||||||
static void go_readonly_synch(struct __vpiCallback*rfp)
|
static void go_readonly_synch(struct __vpiCallback*rfp)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,7 @@ extern struct __vpiNull *vpip_get_null(void);
|
||||||
* This type represents the handle to a Verilog scope. These include
|
* This type represents the handle to a Verilog scope. These include
|
||||||
* module instantiations and name begin-end blocks. The attach
|
* module instantiations and name begin-end blocks. The attach
|
||||||
* function is used to attach handles to the scope by the runtime
|
* function is used to attach handles to the scope by the runtime
|
||||||
* initializaiton.
|
* initialization.
|
||||||
*/
|
*/
|
||||||
struct __vpiScope {
|
struct __vpiScope {
|
||||||
struct __vpiHandle base;
|
struct __vpiHandle base;
|
||||||
|
|
@ -380,7 +380,7 @@ extern void vpip_simulation_run();
|
||||||
extern void vpi_mcd_init(void);
|
extern void vpi_mcd_init(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Schedule an event to be run sometime in the future. The d parmater
|
* Schedule an event to be run sometime in the future. The d parameter
|
||||||
* is the delay in simulation units before the event is processed. If
|
* is the delay in simulation units before the event is processed. If
|
||||||
* the non-block flag is set, the event is scheduled to happen at the
|
* the non-block flag is set, the event is scheduled to happen at the
|
||||||
* end of the time step.
|
* end of the time step.
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IEEE-1364 VPI pretty much mandates the existance of this sort of
|
* IEEE-1364 VPI pretty much mandates the existence of this sort of
|
||||||
* thing. (Either this or a huge memory leak.) Sorry.
|
* thing. (Either this or a huge memory leak.) Sorry.
|
||||||
*/
|
*/
|
||||||
static char buf_obj[128];
|
static char buf_obj[128];
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ semicolon that terminates a statement. Like so:
|
||||||
The semicolon is required, whether the comment is there or not.
|
The semicolon is required, whether the comment is there or not.
|
||||||
|
|
||||||
Statements may span multiple lines, as long as there is no text (other
|
Statements may span multiple lines, as long as there is no text (other
|
||||||
then the first character of a label) in the first column of the
|
than the first character of a label) in the first column of the
|
||||||
continuation line.
|
continuation line.
|
||||||
|
|
||||||
HEADER SYNTAX
|
HEADER SYNTAX
|
||||||
|
|
@ -83,7 +83,7 @@ references symbolically.)
|
||||||
|
|
||||||
If the functor is part of a vector, then the symbol is the
|
If the functor is part of a vector, then the symbol is the
|
||||||
vvp_ipoint_t for the first functor. The [] operator can then be used
|
vvp_ipoint_t for the first functor. The [] operator can then be used
|
||||||
to reference a functor other then the first in the vector.
|
to reference a functor other than the first in the vector.
|
||||||
|
|
||||||
There are some special symbols that in certain contexts have special
|
There are some special symbols that in certain contexts have special
|
||||||
meanings. As inputs to functors, the symbols "C<0>", "C<1>", "C<x>"
|
meanings. As inputs to functors, the symbols "C<0>", "C<1>", "C<x>"
|
||||||
|
|
@ -139,7 +139,7 @@ implementation. Most of the core gate types have built in tables.
|
||||||
The initial values of all the inputs and the output is x. Any other
|
The initial values of all the inputs and the output is x. Any other
|
||||||
value is passed around as run-time behavior. If the inputs have C<?>
|
value is passed around as run-time behavior. If the inputs have C<?>
|
||||||
symbols, then the inputs are initialized to the specified bit value,
|
symbols, then the inputs are initialized to the specified bit value,
|
||||||
and if this causes the output to be something other then x, a
|
and if this causes the output to be something other than x, a
|
||||||
propagation event is created to be executed at the start of run time.
|
propagation event is created to be executed at the start of run time.
|
||||||
|
|
||||||
The strengths of inputs are ignored by functors, and the output has
|
The strengths of inputs are ignored by functors, and the output has
|
||||||
|
|
@ -234,7 +234,7 @@ sake of VPI code that might access it. The variable is placed in the
|
||||||
current scope. The variable also has a width, defined by the indices
|
current scope. The variable also has a width, defined by the indices
|
||||||
for the most significant and lest significant bits. If the indices are
|
for the most significant and lest significant bits. If the indices are
|
||||||
equal (normally 0) the vector has width of one. If the width is greater
|
equal (normally 0) the vector has width of one. If the width is greater
|
||||||
then one, a contiguous array of functors is created and the value of
|
than one, a contiguous array of functors is created and the value of
|
||||||
the label is the address of the least significant bit.
|
the label is the address of the least significant bit.
|
||||||
|
|
||||||
A variable does not take inputs, since its value is set behaviorally
|
A variable does not take inputs, since its value is set behaviorally
|
||||||
|
|
@ -619,7 +619,7 @@ of four possible values (0, 1, x and z) so two bits are needed to
|
||||||
represent them. So the input of the functor is 8 bits, and the output
|
represent them. So the input of the functor is 8 bits, and the output
|
||||||
2 bits. A complete lookup table for generating the 2-bit output from
|
2 bits. A complete lookup table for generating the 2-bit output from
|
||||||
an 8-bit input is 512 bits. That can be packed into 64 bytes. This is
|
an 8-bit input is 512 bits. That can be packed into 64 bytes. This is
|
||||||
small enough that the table should take less space then the code to
|
small enough that the table should take less space than the code to
|
||||||
implement the logic.
|
implement the logic.
|
||||||
|
|
||||||
To implement the truth table, we need to assign 2-bit encodings for
|
To implement the truth table, we need to assign 2-bit encodings for
|
||||||
|
|
@ -779,7 +779,7 @@ becomes:
|
||||||
|
|
||||||
Notice the first parameter of the .functor is the type. The type
|
Notice the first parameter of the .functor is the type. The type
|
||||||
includes a truth table that describes the output with a given
|
includes a truth table that describes the output with a given
|
||||||
input. If the gate is wider then four inputs, then cascade
|
input. If the gate is wider than four inputs, then cascade
|
||||||
functors. For example:
|
functors. For example:
|
||||||
|
|
||||||
and gate (out, i1, i2, i3, i4, i5, i6, i7, i8);
|
and gate (out, i1, i2, i3, i4, i5, i6, i7, i8);
|
||||||
|
|
|
||||||
|
|
@ -669,7 +669,7 @@ void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
|
||||||
for (unsigned idx = 0; idx < argc; idx += 1) {
|
for (unsigned idx = 0; idx < argc; idx += 1) {
|
||||||
|
|
||||||
/* Find the functor for this input. This assumes that
|
/* Find the functor for this input. This assumes that
|
||||||
wide (more then 4 inputs) gates are consecutive
|
wide (more than 4 inputs) gates are consecutive
|
||||||
functors. */
|
functors. */
|
||||||
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
|
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
|
||||||
functor_t iobj = functor_index(ifdx);
|
functor_t iobj = functor_index(ifdx);
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ m .var "m", 6,0;
|
||||||
;;; memory words occupy 8 bits each, that is 7 rounded up to the next
|
;;; memory words occupy 8 bits each, that is 7 rounded up to the next
|
||||||
;;; multiple of 4.
|
;;; multiple of 4.
|
||||||
|
|
||||||
;;; Four bits ber byte. Word fill bits are included. Commas are
|
;;; Four bits per byte. Word fill bits are included. Commas are
|
||||||
;;; optional, there may be a comma after the last byte.
|
;;; optional, there may be a comma after the last byte.
|
||||||
|
|
||||||
.mem/init memory[20],
|
.mem/init memory[20],
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
EXECUTABLE INSTRUCTION OPCODES
|
EXECUTABLE INSTRUCTION OPCODES
|
||||||
|
|
||||||
Instruction opcodes all start with a % character and have 0 or more
|
Instruction opcodes all start with a % character and have 0 or more
|
||||||
operands. In no case are there more then 3 operands. This chapter
|
operands. In no case are there more than 3 operands. This chapter
|
||||||
describes the specific behavior of each opcode, in enough detail
|
describes the specific behavior of each opcode, in enough detail
|
||||||
(I hope) that its complete effect can be predicted.
|
(I hope) that its complete effect can be predicted.
|
||||||
|
|
||||||
|
|
@ -160,8 +160,8 @@ same, or 0 otherwise. The eq bit is true if the values are logically
|
||||||
the same. That is, x and z are considered equal. In other words the eq
|
the same. That is, x and z are considered equal. In other words the eq
|
||||||
bit is the same as ``=='' and the eeq bit ``===''.
|
bit is the same as ``=='' and the eeq bit ``===''.
|
||||||
|
|
||||||
The lt bit is 1 if the left vector is less then the right vector, or 0
|
The lt bit is 1 if the left vector is less than the right vector, or 0
|
||||||
if greater then or equal to the right vector. It is the equivalent of
|
if greater than or equal to the right vector. It is the equivalent of
|
||||||
the Verilog < operator. Combinations of these three bits can be used
|
the Verilog < operator. Combinations of these three bits can be used
|
||||||
to implement all the Verilog comparison operators.
|
to implement all the Verilog comparison operators.
|
||||||
|
|
||||||
|
|
@ -252,7 +252,7 @@ thread to start executing at the specified address. The new thread is
|
||||||
created and pushed onto the child stack. It is also marked runnable,
|
created and pushed onto the child stack. It is also marked runnable,
|
||||||
but is not necessarily started until the current thread yields.
|
but is not necessarily started until the current thread yields.
|
||||||
|
|
||||||
The %fork instruction has no effect other then to push a child thread.
|
The %fork instruction has no effect other than to push a child thread.
|
||||||
|
|
||||||
See also %join.
|
See also %join.
|
||||||
|
|
||||||
|
|
@ -327,7 +327,7 @@ will jump to T_label if bit 8 is x or z.
|
||||||
|
|
||||||
This is the partner to %fork. This instruction causes the thread to
|
This is the partner to %fork. This instruction causes the thread to
|
||||||
wait for the top thread in the child stack to terminate, then
|
wait for the top thread in the child stack to terminate, then
|
||||||
continues. It has no effect in the current thread other then to wait
|
continues. It has no effect in the current thread other than to wait
|
||||||
until the top child is cleared.
|
until the top child is cleared.
|
||||||
|
|
||||||
It is an error to execute %join if there are no children in the child
|
It is an error to execute %join if there are no children in the child
|
||||||
|
|
@ -539,7 +539,7 @@ complete bounds checking.
|
||||||
|
|
||||||
The %set/x0/x instruction is the same, except the bound value is in
|
The %set/x0/x instruction is the same, except the bound value is in
|
||||||
a word register instead of in the opcode. This allows for bounds that
|
a word register instead of in the opcode. This allows for bounds that
|
||||||
are larger then 0xffff.
|
are larger than 0xffff.
|
||||||
|
|
||||||
|
|
||||||
* %shiftl/i0 <bit>, <wid>
|
* %shiftl/i0 <bit>, <wid>
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ struct vvp_udp_s *udp_find(char *label);
|
||||||
* also points to the vvp_udp_s table that is the behavior for the
|
* also points to the vvp_udp_s table that is the behavior for the
|
||||||
* device.
|
* device.
|
||||||
*
|
*
|
||||||
* If there are more then 4 inputs to the device, then enough
|
* If there are more than 4 inputs to the device, then enough
|
||||||
* edge_inputs_functor_s functors is created to receive all the
|
* edge_inputs_functor_s functors is created to receive all the
|
||||||
* inputs. All the edge_inputs_functors_s ::out members point to the
|
* inputs. All the edge_inputs_functors_s ::out members point to the
|
||||||
* leading udp_functor_s object, so the ::set methods all invoke the
|
* leading udp_functor_s object, so the ::set methods all invoke the
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ System tasks and functions in Verilog are implemented in Icarus
|
||||||
Verilog by C routines written with VPI. This implies that the vvp
|
Verilog by C routines written with VPI. This implies that the vvp
|
||||||
engine must provide at least a subset of the Verilog VPI
|
engine must provide at least a subset of the Verilog VPI
|
||||||
interface. The minimalist concepts of vvp, however, make the method
|
interface. The minimalist concepts of vvp, however, make the method
|
||||||
less then obvious.
|
less than obvious.
|
||||||
|
|
||||||
Within a Verilog design, there is a more or less fixed web of
|
Within a Verilog design, there is a more or less fixed web of
|
||||||
vpiHandles that is the design database as is available to VPI
|
vpiHandles that is the design database as is available to VPI
|
||||||
|
|
@ -108,7 +108,7 @@ A scope is created with a .scope directive, like so:
|
||||||
The scope takes a string name as the first parameter. If there is an
|
The scope takes a string name as the first parameter. If there is an
|
||||||
additional parameter, it is a label of the directive for the parent
|
additional parameter, it is a label of the directive for the parent
|
||||||
scope. Scopes that have no parent are root scopes. It is an error to
|
scope. Scopes that have no parent are root scopes. It is an error to
|
||||||
declare a scope with the same name more then once in a parent scope.
|
declare a scope with the same name more than once in a parent scope.
|
||||||
|
|
||||||
The name string given when creating the scope is the basename for the
|
The name string given when creating the scope is the basename for the
|
||||||
scope. The vvp automatically constructs full names from the scope
|
scope. The vvp automatically constructs full names from the scope
|
||||||
|
|
|
||||||
|
|
@ -227,7 +227,7 @@ extern "C" FILE *vpi_get_file(PLI_INT32 fd)
|
||||||
// Only deal with FD's
|
// Only deal with FD's
|
||||||
if (IS_MCD(fd)) return NULL;
|
if (IS_MCD(fd)) return NULL;
|
||||||
|
|
||||||
// Only know about FD_MAX indicies
|
// Only know about FD_MAX indices
|
||||||
if (FD_IDX(fd) >= FD_MAX) return NULL;
|
if (FD_IDX(fd) >= FD_MAX) return NULL;
|
||||||
|
|
||||||
return fd_table[FD_IDX(fd)].fp;
|
return fd_table[FD_IDX(fd)].fp;
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ void vpip_load_module(const char*name)
|
||||||
sprintf(buf, "%s.vpi", name);
|
sprintf(buf, "%s.vpi", name);
|
||||||
rc = stat(buf, &sb);
|
rc = stat(buf, &sb);
|
||||||
|
|
||||||
/* Tray alwo with the .vpl suffix. */
|
/* Try also with the .vpl suffix. */
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
export_flag = true;
|
export_flag = true;
|
||||||
sprintf(buf, "%s.vpl", name);
|
sprintf(buf, "%s.vpl", name);
|
||||||
|
|
|
||||||
|
|
@ -281,7 +281,7 @@ static const struct __vpirt vpip_sysfunc_real_rt = {
|
||||||
systask_iter
|
systask_iter
|
||||||
};
|
};
|
||||||
|
|
||||||
/* **** Manipulate the internal datastructures. **** */
|
/* **** Manipulate the internal data structures. **** */
|
||||||
|
|
||||||
static struct __vpiUserSystf**def_table = 0;
|
static struct __vpiUserSystf**def_table = 0;
|
||||||
static unsigned def_count = 0;
|
static unsigned def_count = 0;
|
||||||
|
|
|
||||||
|
|
@ -345,7 +345,7 @@ void vthread_run(vthread_t thr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The CHUNK_LINK instruction is a specla next pointer for linking
|
* The CHUNK_LINK instruction is a special next pointer for linking
|
||||||
* chunks of code space. It's like a simplified %jmp.
|
* chunks of code space. It's like a simplified %jmp.
|
||||||
*/
|
*/
|
||||||
bool of_CHUNK_LINK(vthread_t thr, vvp_code_t code)
|
bool of_CHUNK_LINK(vthread_t thr, vvp_code_t code)
|
||||||
|
|
@ -2862,7 +2862,7 @@ bool of_FORK_UFUNC(vthread_t thr, vvp_code_t cp)
|
||||||
|
|
||||||
/* After this function, the .ufunc code has placed an of_JOIN
|
/* After this function, the .ufunc code has placed an of_JOIN
|
||||||
to pause this thread. Since the child was pushed by the
|
to pause this thread. Since the child was pushed by the
|
||||||
flag to schecule_vthread, the called function starts up
|
flag to schedule_vthread, the called function starts up
|
||||||
immediately. */
|
immediately. */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
xnfio.cc
2
xnfio.cc
|
|
@ -305,7 +305,7 @@ void xnfio_f::lpm_compare(Design*des, NetCompare*dev)
|
||||||
|
|
||||||
bool xnfio_f::compare_sideb_const(Design*des, NetCompare*dev)
|
bool xnfio_f::compare_sideb_const(Design*des, NetCompare*dev)
|
||||||
{
|
{
|
||||||
/* Even if side B is all constant, if there are more then 4
|
/* Even if side B is all constant, if there are more than 4
|
||||||
signals on side A we will not be able to fit the operation
|
signals on side A we will not be able to fit the operation
|
||||||
into a function unit, so we might as well accept a
|
into a function unit, so we might as well accept a
|
||||||
comparator. Give up. */
|
comparator. Give up. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue