Hello,

I am trying to develop a behavioral model of a ferroelectric capacitor using verilog-a. The ferroelectric material is HfO2 in between the capacitor plates. I know the polarization hysteresis formula which works for my HfO2 capacitor. So I try to model the polarization hysteresis first whose unit is "uC/cm^2". So to get the charge (Q) I just need to multiply the area of the capacitor. Form charge (Q), I can get the current (I) in the capacitor of my capacitor model. Here is the formula for the polarization:

P

_{F(P/E)}(V) = P

_{S(P/E)} tanh(((V-V

_{c(P/E)})÷2V

_{c(P/E)})*ln((P

_{S}+P

_{r})/(P

_{S}-P

_{r})))

For (P/E): P refers to upward hysteresis and E refers to downward hysteresis.

My verilog-a code:

**Code:**`include "constants.vams"
`include "disciplines.vams"
// in: Input terminal
// out: Output terminal
// th: thickness
module Fe_cap_HfO2(in, out);
//Nodes
inout in, out;
electrical in, out, x, y, m;
// parameter declaration: name = default value [units]
parameter real area = 0.046755; // [cm2]
parameter real Pr_p = 11.7325; // [uC/cm2]
parameter real Pr_e = -12.0627; // [uC/cm2]
parameter real Ps_p = 22.6455; // [uC/cm2]
parameter real Ps_e = -22.6455; // [uC/cm2]
parameter real Vc_p = 1.22232; // [V]
parameter real Vc_e = -1.067; // [V]
parameter real th = 1e-8; // [nm]
// Variables
real Pf; // polarization variable
real Vbr_p; // breakdown voltage (positive)
real Vbr_e; // breakdown voltage (negative)
real Q; // capacitor charge
analog begin
Vbr_p = 3*Vc_p;
Vbr_e = -3*Vc_p;
if (V(in) > 0)
begin
if (V(in) > Vbr_p)
V(x) <+ Vbr_p;
else
V(m) <+ V(in);
end
else if (V(in) < 0)
begin
if (V(in) < Vbr_e)
V(y) <+ Vbr_e;
else
V(m) <+ V(in);
end
@(cross(Vbr_e<V(m)<Vbr_p, +1.0))
Pf = Ps_p*tanh[{(V(m)-Vc_p)/(2*Vc_p)}*ln{(Ps_p+Pr_p)/(Ps_p-Pr_p)}];
@(cross(Vbr_e<V(m)<Vbr_p, -1.0))
Pf = Ps_e*tanh[{(V(m)-Vc_e)/(2*Vc_e)}*ln{(Ps_e+Pr_e)/(Ps_e-Pr_e)}];
Q = Pf*area;
I(in, out) <+ ddt(Q);
end
endmodule

While saving the verilog-a code in the cellview in Cadence Virtuoso, it shows error which I attached in the image as screenshot. What is the problem in the identifier definition?

And is the conditional statement ok for my code to characterize the hysteresis?

I am not that expert in verilog-a. Can anyone help me?

I am using Cadence Virtuoso with spectre simulator.

Version: ICADV12.3-64b.500.21