A programming verification method of verifying programming of a
nonvolatile memory cell, the method comprising at least the steps of:
selecting first, second, . . . and n-th references corresponding to
first, second, . . . and n-th threshold voltages specifying lower limit
values of states 1, 2, . . . and n, respectively; applying a programming
voltage to the nonvolatile memory cell; sensing a threshold voltage level
of the nonvolatile memory cell; comparing the sensed threshold voltage
level with the first reference to output a first result; comparing the
threshold voltage level with one of the second and third references
selected according to the first result to output a second result; and
comparing the first and second results with an expectation value and, in
the case where the first and second results are equal to the expectation
value, indicating that the programming has succeeded, wherein the
nonvolatile memory cell includes a gate electrode formed on a
semiconductor layer via a gate insulating film, a channel region disposed
under the gate electrode, a source and a drain as diffusion regions
disposed on both sides of the channel region and having a conductive type
opposite to that of the channel region, and memory functional units
formed on both sides of the gate electrode and having the function of
retaining charges.