• The Verilog-AMS Language
  • Continuous Assigns

Continuous Assigns 

A module may have any number of continuous assign statements. Continuous assign statements are used to drive values on to wires. For example:

This is referred to as a continuous assign because the wire on the left-hand side of the assignment operator is continuously driven with the value of the expression on the right hand side. The target of the assign statement must be a wire. The continuous assign statement is not a procedural statement and so must be used at the module level; it cannot be placed in an initial or always process.

You can add delay to a continuous assign statement as follows:

In this case, the value of a changes 10 units of time after the expression b & c changes. Continuous assign statement implement inertial delay, meaning that continuous assign statements swallow glitches. This is illustrated below with the assumption that the unit of time is 1ns.

../../_images/inertial-delay.png

It is possible to specify up to three delay values on a continuous assignment:

When you specify more than one:

The first delay refers to the transition to the 1 value (rise delay).

The second delay refers to the transition to the 0 value (fall delay).

The third delay refers to the transition to the high-impedance value.

When a value changes to the unknown (x) value, the delay is the smallest of the delays specified.

If only two delays are specified, then the delay to high-impedance is the smallest of the two values specified.

Delay in Assignment (#) in Verilog

Syntax : #delay

It delays execution for a specific amount of time, ‘delay’.

There are two types of delay assignments in Verilog:

Delayed assignment: #Δt variable = expression; // “ expression”  gets evaluated after the time delay Δt and assigned to the “variable” immediately Intra-assignment delay: variable = #Δt expression;  // “expression” gets evaluated at time 0 but gets assigned to the “variable” after the time delay Δt

Note: #(delay) can not be synthesized. So we do not use #(delay) in RTL module to create delay. There are other methods which can be used to create delays in RLT module. #(delay) can be used in testbench files to create delays.

Spread the Word

  • Click to share on Facebook (Opens in new window)
  • Click to share on Twitter (Opens in new window)
  • Click to share on LinkedIn (Opens in new window)
  • Click to share on Pinterest (Opens in new window)
  • Click to share on Tumblr (Opens in new window)
  • Click to share on Pocket (Opens in new window)
  • Click to share on Reddit (Opens in new window)
  • Click to email a link to a friend (Opens in new window)
  • Click to print (Opens in new window)

Related posts:

  • Blocking (immediate) and Non-Blocking (deferred) Assignments in Verilog
  • Ports in Verilog Module
  • Synthesis and Functioning of Blocking and Non-Blocking Assignments.
  • Module Instantiation in Verilog

Post navigation

Leave a reply cancel reply.

Your email address will not be published. Required fields are marked *

Save my name, email, and website in this browser for the next time I comment.

Notify me of follow-up comments by email.

Notify me of new posts by email.

Gisselquist Technology, LLC

Assignment delay's and Verilog's wait statement

Sep 21, 2022

I’ve now spent more time than I want to admit to debugging simulation issues when using Verilog’s simulation semantics. Let me therefore share some problems I’ve come across, together with my proposed solution for them.

The Problems

Today’s problem stems from logic like the following:

In general, this comes to me in “working” simulation code that’s been handed down to me to maintain. The simulations that use this logic often take hours to run, and so debugging this sort of thing can be very time consuming. (Costly too–my hourly rate isn’t cheap.)

Let’s walk through this logic for a moment–before tearing it apart.

In this example the first condition, the one I’ve called trigger_condition above, is simply some form of data change condition. Sometimes its a reference to a clock edge, sometimes its a reference to a particular piece of data changing. This isn’t the problem.

The second condition, some_other_condition_determining_relevance , is used to weed out all the times the always block might get triggered when you don’t want it to be. For example, it might be triggered during reset or when the slave device being modeled is currently responsive to some other trigger_condition . This is natural. This is not (yet) a problem either.

So what’s the problem with the logic above? Well, let’s start with the #1 assignment delay. In this case, it’s not representing a true hardware delay. No, the #1 is there in order to schedule Verilog simulation statement execution. Part of the reason why it’s there is because the rest of the block uses blocking logic (i.e. via the = ). Hence, if this block was triggered off of a clock edge, the #1 allows us to reason about what follows the clock edge but before the next edge.

Now, let me ask, what happens five years from now when clock speeds get faster? Some poor soul (like me) will be hired to maintain this logic, and that poor soul will look at the #1 and ask, why is this here? Maybe it was a 1ns delay, and they are now trying to run a clock at 500MHz instead of 100MHz. That 1ns delay will need to be understood, and replaced– everywhere it was used. It doesn’t help that the 1ns doesn’t come with any explanations, but that may be specific to the examples I’m debugging.

Here’s a second problem, illustrated in Fig. 2: what happens when you use this one nanosecond delay in multiple always blocks, similar to this one, all depending on each other? Which one will execute first?

The third problem often follows this one, and it involves a wait statement of some type. To illustrate this, let me modify the example above a bit more.

In this case, the user wants to make certain his logic is constant across the clock edge, and so he sets all his values on the negative edge of the clock. This leads to two problems: what happens when the #1 delay conflicts with the clock edge? And what happens when the output value depends upon other inputs that are set on the negative clock edge?

Fig. 3 shows another problem, this time when using a case statement. In this case, it’s an attempt to implement a command structure within a modeled device. The device can handle one of many commands, so depending on which one is received you go and process that command. The actual example this is drawn from was worse, since it depended not only on commands but rather command sequences, and the command sequences were found within case statements within case statements.

What’s wrong with this? Well, what happens when the original trigger takes place a second time, but the logic in the always block hasn’t finished executing? Perhaps this is erroneous. Perhaps it finishes just barely on the wrong side of the next clock edge. In my case, I find the bug four hours later–on a good day. It doesn’t help that simulations tend to run rather slow.

A better approach would’ve been to use a state machine rather than embedded tasks. Why is this better? Well, if for no other reason, a case statement would contain state variables which could be seen in the trace file. That means that you could then find and debug what would (or should) happen when/if the new command trigger shows up before a prior command completes.

These problems are only compounded when this logic is copied. For example, imagine a device that can do tasks A, B, and C, but requires one of two IO protocols to accomplish task A, B, or C. Now, if that IO protocol logic is copied and embedded into each of the protocol tasks, then all three will need to be updated when the IO protocol is upgraded. (I2C becomes I3C, SPI becomes Quad SPI, etc.)

While some of these problems are specific to hardware, many are not. Magic numbers are a bad idea in both RTL and software. Design reuse and software reuse are both very real things. Even a carpenter will build a custom jig of some type when he has to make fifty copies of the same item.

The good news is that better approaches exist.

Defining terms

Before diving into some better approaches, let me take just a couple of moments to introduce the terms I will be using. In general, a test bench has three basic (types of) components, as illustrated in Fig. 6.

The Device Under Test (DUT) : The is the hardware component that’s being designed, and for which the test has been generated.

Since the DUT is intended to be synthesizable, Verilog delay statements are inappropriate here.

The Hardware Device Model, or just model : Our hardware component is being designed to interact with an external piece of hardware. This component is often off-chip, and so our “model” is a simulation component designed to interact with our IP in the same way the actual hardware would.

Although I’ve called these “models” “emulators” in the past, these aren’t truly “emulators”. An “emulator” would imply a description of the actual hardware existed, such as an RTL description, yielding an additional level of realism in simulation. Barring sufficient information from the external device’s manufacturer to actually and truly “emulate” the device, the test designer often settles for a “model” instead.

Hardware models may naturally require Verilog delays in order to model the interfaces they are designed for. For example, a signal may take some time to transition from a known value to an unknown one following a clock transition. As another example, a hardware device may become busy following a command of some kind. The good news is that Verilog can model both of these behaviors nicely.

How to handle these delays “properly” will become part of the discussion below.

The Test Script, or driver : This is the component of the design that interacts with the device under test, sequencing commands to given to it to make sure all of the capabilities of the DUT are properly tested.

This component of the Verilog test script often reads more like it is software than hardware. Indeed, we’ve already discussed the idea of replacing the test script with a piece of software compiled for a soft-core CPU existing in the test environment, and then emulating that CPU as part of the simulation model . The benefit of this approach is that it can test and verify the software that will be used to drive the hardware under test. The downside is that simulation’s are slow, and adding a CPU to the simulation environment can only slow it down further.

For the purposes of our discussion today I’ll simply note that the test script commonly interacts with the design in a synchronous manner. Any delays, therefore, need to be synchronized with the clock.

There is another problem with the driver that we won’t be discussing today. This is the simple reality that there’s no way to test all possible driver delays. Will a test driver accurately test if your DUT can handle back to back requests, requests separated by a single clock cycle, by two clock cycles, by N clock cycles? You can’t simulate all of these possible delays, but you can catch them using formal methods.

Not shown in Fig. 6, but also relevant is the Simulation Environment : While the DUT and model are both necessary components of any simulation environment, the environment might also contains such additional components as an AXI interconnect , CPU , DMA, and/or RAM , all of which are neither the test script, DUT, or model.

Ideally these extra components will have been tested and verified in other projects prior to the current one, although this isn’t always the case.

Now that we’ve taken a moment to define our terms, we can now return to the simulation modeling problem we began.

Better practices

The good news is that Verilog was originally written as a language for driving simulations.

Even better, subsets of Verilog exist which can do a good job of modeling synthesizable logic. This applies to both asynchronous and synchronous logic. The assignment delay problems that I’ve outlined above, however, arise from trying to use Verilog to model a mix of logic and software when the goal was to create a hardware device model.

Here are some tips, therefore, for using delays in Verilog:

Write synthesizable simulation logic where possible.

This is really only an issue for test bench or modeling logic. It’s not really an issue for logic that was meant to be synthesizable in the first place.

The good news about writing test bench logic in a synthesizable fashion is that you might gain the ability to synthesize your model in hardware, and then run tests on it just that much faster. You could then also get a second benefit by formally verifying your device model–it’d save you that much time later when running integrated simulations.

As an example, compare the following two approaches for verifying a test chip:

ASIC Test chip #1: Has an SPI port capable of driving internal registers. This is actually a really good idea, since you can reduce the number of wires necessary to connect to such a test chip. The problem, however, was that the SPI driver came from encrypted vendor IP. Why was this a problem? It became a problem when the test team tried to connect to the device once it had been realized in hardware. They tried to connect their CPU to this same SPI port to drive it–and then didn’t drive it according to protocol properly.

The result of testing ASIC test chip #1? I got a panic’d call from a client, complaining that the SPI interface to the test chip wasn’t working and asking if I could find the bugs in it.

ASIC Test chip #2: Also has a SPI port for reading and writing internal registers. In this chip, however, the SPI port was formally verified as a composition of both the writer and the reader–much as Fig. 7 shows below.

I say “much as Fig. 7 shows” because the verification of this port wasn’t done with using the CPU as part of the test script. However, because both the SPI master and SPI slave were verified together, and even better because they were formally verified in an environment containing both components, the test team can begin it’s work with a verified RTL interface.

You can even go one step farther by using a soft-core CPU to verify the software driver at the same time. This is the full extent of what’s shown in Fig. 7. As I mentioned above, the formal verification for ASIC test chip #2 stopped at the AXI-lite control port for the SPI master. When testing this chip as part of an integrated test, a test script was used to drive a Bus Functional Model (BFM), rather than actual CPU software. However, if you just read the test script’s calls to the BFM, you would have the information necessary to build a verified software driver.

Use always @(*) for combinatorial blocks, and always @(posedge clk) (or negedge) or always @(posedge clk or negedge reset_n) for synchronous logic.

While I like using the positive edge of a clock for everything, the actual edge you need to use will likely be determined by the device and protocol you are modeling. The same is true of the reset.

I would discourage the use of always @(trigger) , where trigger is some combinatorial signal–lest you forget some required trigger component. I would also discourage the use of any always @(posedge trigger) blocks where trigger wasn’t a true clock–lest you create a race condition within your logic. I use the word discourage , however, because some modeling contexts require triggering on non-clocked logic. If there’s no way around it, then you do what you have to do to get the job done.

Synchronous (clocked) logic should use non-blocking assignments ( <= ), and combinatorial logic should use blocking assignments ( = ).

It seems like my debugging problems began when the prior designer used a delay instead of proper blocking assignments.

Just … don’t do this. When you start doing things like this, you’ll never know if (whatever) expression had finished evaluating, or be able to keep track of when the #1 delay needs to be updated.

Device models aren’t test drivers. Avoid consuming time within them–such as with a wait statement of any type. Let the time be driven elsewhere by external events.

This applies to both delays and wait conditions within always blocks, as well as any tasks that might be called from within them. Non-blocking assignment delays work well for this purpose.

Ideally, device models should use finite state machines, as in Fig. 4, to model the passing of time if necessary, rather than consuming time with wait statements or ill defined assignment delays, as in Fig. 3.

When driving synchronous logic from a test script, synchronize any test driven signals using non-blocking assignments.

I have now found the following simulation construct several times over:

Sometimes the author uses the negative edge of the clock instead of the positive edge here to try to “schedule” things away from the clock edge. Indeed, I’ve been somewhat guilty of this myself . Sadly, this causes no end of confusion when trying to analyze a resulting trace file.

A better approach would be to synchronize this logic with non-blocking assignments.

This will avoid any delta-time cycle issues that would otherwise be very difficult to find and debug. Note that this also works because this block is the only block controlling ARVALID from within the test bench. Should you wish to control ARVALID from multiple test bench clocks, you may run into other concurrency problems.

While you can still do this sort of thing with Verilator, I’ll reserve my solution for how to do it for another post.

Pick a clock edge and use it. Don’t transition on both edges–unless the hardware protocol requires it.

As I alluded to above, I’ve seen a lot of AXI modeling that attempts to set the various AXI signals on the negative edge of the clock so that any and all logic inputs will be stable later when the positive edge comes around. This approach is all well and good until someone wants to do post–layout timing analysis, or some other part of your design also wants to use the negative edge, and then pain ensues.

Sadly, this means that the project may be turned in and then rest in a “working” state for years before the problem reveals itself.

In a similar fashion, what happens when you have two always blocks, both using a #1 delay as illustrated in Fig. 2 above? Or, alternatively, what happens when you want the tools to put real post place-and-route delays into your design for a timing simulation? You may find you’ve already lost your timing slack due to a poor simulation test bench or model. Need I say that it would be embarrassing to have to own up to a timing failure in simulation, due to your own simulation constructs?

There is a time for using multiple always blocks–particularly when modeling DDR devices.

In today’s high speed devices, I’ve often found the need for multiple always blocks, triggered off of different conditions, to capture the various triggers and describe the behavior I want. One, for example, might trigger off the positive edge, and another off the negative edge. This is all fine, well, and good for simulation (i.e. test bench ) logic. While this would never work in hardware, it can easily be used to accurately model behavior in simulation.

Use assignment delays to model physical hardware delays only .

For example, if some event will cause the ready line to go low for 50 microseconds, then you might write:

Notice how I’ve carefully chosen not to consume any time within this always block, yet I’ve still managed to create something that will capture the passage of time. In this case, I’ve used the Verilog <= together with a delay statement to schedule the transition of ready from zero back to one by #tWAIT ns.

I’ve now used this approach on high speed IO lines as well, with a lot of success. For example, if the data will be valid tDVH after the clock goes high and remain valid for tDV nanoseconds, then you might write:

I’ve even gone so far in some cases to model the ‘x values in this fashion as well. That way the output is properly ‘x while the voltage is swinging from one value to the next.

No magic numbers ! Capture hardware delays in named parameters, specparams, and registers, rather than using numeric assignment delays.

For example, were I modeling a flash memory, I might do something like the following to model an erase:

Notice the use of tERASE rather than some arbitrary erase time buried among the logic. Placing all such device dependent times in one location (at the top of the file) will then make it easier to upgrade this logic for a new and faster device at a later time.

We can also argue about when the actual erase should take place. As long as the user can’t interact with the device while it’s busy , this probably doesn’t make a difference. Alternatively, we could register the erase address and set a time for later when the erase should take place.

Even this isn’t perfect, however, since we now have a transition taking place on something other than a clock. Given that the interface clock isn’t continuous, this may still be the best option to create a reliable edge.

  • The rule of 3 applies to hardware as well as software: if you have to write the same logic more than twice, then you are doing something wrong. Refactor it. Encapsulate it. Make a module to describe it, and then reuse that module.

Remember our example from Fig. 5 above? Fig. 9 shows a better approach to handling three separate device tasks, each with two separate protocols that might be used to implement them.

For protocols that separate themselves nicely between the link layer control (LLC) protocol and a media access control (MAC) layer, this works nicely to rearrange the logic so that each layer only needs to be written once, rather than duplicated within structures implementing both MAC and LLC layers together.

Remember: fully verified, well tested, well written logic is pure re-usable gold in this business. Do the job right the first time, and you’ll reap dividends for years to come.

Today’s story

A client recently called me to ask if I could modify an IP I had written so that it would be responsive on an APB slave input with a different clock frequency from the one the rest of the device model used.

The update required inserting an APB cross clock domain bridge into the IP. This wasn’t hard, since I’d built (and formally verified) such a bridge two months prior–I just needed to connect the wires and do a bit of signal renaming for the case when the bridge wasn’t required.

That was the easy part.

But, how shall this new capability be tested? It would need an updated test script and more.

Thankfully, this was also easy.

Because I had built the top level simulation construct using parameters, which could easily be overridden by the test driver , the test suite was easy to update: I just had to set an asynchronous clock parameter, create a new parameter for the clock speed, adjust the clock speed itself, and away I went. Thankfully, I had already (over time) gotten rid of any inappropriate delays, so the update went smoothly.

Smoothly? Indeed, the whole update took less than a half an hour. (This doesn’t include the time it took to originally build and verify a generic APB cross-clock domain bridge.)

… and that’s what you would hope for from well written logic.

Well, okay, it’s not all roses–I still have to go back and update the user guide, update the repository, increment the IP version, update the change log, and then bill for the task. Those tasks will take longer than the actual update, but such is the business we are in.

Let’s face it, this article is a rant. I know it. Perhaps you’ll learn something from it. Perhaps I’ll learn something from any debate that will ensue. (Feel free to comment on Reddit …)

Yes, I charge by the hour. Yes, messes like these will keep me gainfully employed and my family well fed for years to come. However, I’d rather charge for doing the useful work of adding new capabilities to a design rather than fixing up someone else’s mess.

Verification Guide

Variable delay in SVA

Static delay.

Table of Contents

If signal “a” is high on any given positive edge of the clock, the signal “b” should be high 2 clock cycles after that.

Variable Delay

Using ##v_delay leads to compilation error because it is Illegal to use a variable in an assertion.

Simulator Output

system verilog assign delay

Below is one of the ways to implement the variable delay

Instead of ##v_delay , sequence ‘ delay_seq ‘ is used for variable delay. delay_seq works like while loop, variable value will be decremented on each clk cycle and checks for the value of ‘delay’ equals to ‘0’. The sequence will get ended once the value of ‘ delay ‘ equals ‘0’.

  • (1,delay=v_delay)                                    -> Copy variable value to local variable.
  • (1,delay=delay-1) [*0:$] ##0 delay <=0 -> Decrements the value of local variable and checks for value of ‘delay’ equals to ‘0’.
  • first_match((1,delay=delay-1) [*0:$] ##0 delay <=0) -> waits for value of ‘delay’ equals to ‘0’

❮ Previous Next ❯

Verilog Gate Delay

One delay format, two delay format, three delay format.

Digital elements are binary entities and can only hold either of the two values - 0 and 1. However the transition from 0 to 1 and 1 to 0 have a transitional delay and so does each gate element to propagate the value from input to its output.

For example, a two input AND gate has to switch the output to 1 if both inputs become 1 and back to 0 when any of its inputs become 0. These gate and pin to pin delays can be specified in Verilog when instantiating logic primitives .

Rise, Fall and Turn-Off Delays

Verilog delay types

These delays are actually applicable to any signal as they all can rise or fall anytime in real circuits and are not restricted to only outputs of gates. There are three ways to represent gate delays and the two delay format can be applied to most primitives whose outputs do not transition to high impedance. Like a three delay format cannot be applied to an AND gate because the output will not go to Z for any input combination.

Delay Specification Format

See that the output of AND gates change 2 time units after one of its inputs change. For example, b becomes 1 while a is already 1 at T=20. But the output becomes 1 only at T=22. Similarly, a goes back to zero at T=30 and the output gets the new value at T=32.

Gate delay is specified as 3 time units for BUFIF0 and hence when b changes from 0 to 1 while a is already at 1, output takes 3 time units to get updated to Z and finally does so at T=23.

Let's apply the same testbench shown above to a different Verilog model shown below where rise and fall delays are explicitly mentioned.

Min/Typ/Max Delays

Delays are not the same in different parts of the fabricated chip nor is it same for different temperatures and other variations. So Verilog also provides an extra level of control for each of the delay types mentioned above. Every digital gate and transistor cell has a minimum, typical and maximum delay specified based on process node and is typically provided by libraries from fabrication foundry.

For each type of delay - rise, fall, and turn-off - three values min , typ and max can be specified and stand for minimum, typical and maximum delays.

DMCA.com Protection Status

N.Y. judge denies Trump request to delay hush money trial

William Brangham

William Brangham William Brangham

Ali Schmitz Ali Schmitz

Leave your feedback

  • Copy URL https://www.pbs.org/newshour/show/n-y-judge-denies-trump-request-to-delay-hush-money-trial

A judge in New York City ruled Donald Trump will go on trial to face felony charges he falsified business records to cover up a sex scandal to protect his presidential campaign. The judge rejected Trump’s motions to dismiss or delay the case and told lawyers to prepare for trial starting March 25. The former president criticized the case as politically motivated. William Brangham reports.

Read the Full Transcript

Notice: Transcripts are machine and human generated and lightly edited for accuracy. They may contain errors.

Amna Nawaz:

A judge in New York City today ruled that Donald Trump will go on trial next month to face felony charges that he falsified business records to cover up a sex scandal in order to protect his presidential campaign.

The judge rejected Trump's motion to dismiss or delay the case and told lawyers to prepare for trial starting March 25. The former president attended the hearing today and again criticized the case against him as politically motivated.

Donald Trump , Former President of the United States (R) and Current U.S. Presidential Candidate: They want to keep me nice and busy so I can't campaign so hard, but maybe we won't have to campaign so hard, because the other side is incompetent.

Our William Brangham was in the courtroom this morning, and he joins me now.

So, William, of all the current cases against the former president, this was the oldest. It's now the first to go to trial, but just remind us, what are the charges that former President Trump is facing here?

William Brangham:

Let's go back in time, back to 2016.

The presidential campaign is nearing the end, Trump versus Hillary Clinton. The "Access Hollywood" tape has just come out. And right around that time, Trump's fixer, Michael Cohen, pays Stormy Daniels, a woman named Stephanie Clifford — she's a pornographic film actress — $130,000 to stop her from going public with her story about having a sexual relationship with the married candidate, Donald Trump .

Michael Cohen says that Donald Trump directed him to make that payment. The election happens, Trump is elected, and he's in the White House. And then Trump reimburses Michael Cohen that $130,000.

And it is at that point that the Manhattan district attorney, Alvin Bragg, argues that Donald Trump had committed fraud, because he's arguing that he falsified business records to cover up that payment for why he gave that payment in the first place, why he was reimbursing Michael Cohen, and why Michael Cohen was paying Stormy Daniels in the first place.

So, he's charged Trump, Alvin Bragg has charged him with 34 counts of falsifying records. And he's basically arguing that Trump was trying to hide this fact from voters, and thus was — this is an election-related crime. He says that he falsified these records and that that's what's going to be in this case that will be starting soon.

The legal analysts I have spoken to note that these are relatively low-level felony charges that the former president is facing. And so even if he were convicted of all of them, most of them believe it is very unlikely that the former president would be facing any prison time.

So, William, this case in New York was always expected to take a back seat to a federal case down here in Washington on election interference. So, how did this end up going to trial first? And what does that mean for the case?

The D.C. January 6 election case being brought by special counsel Jack Smith, that was always supposed to go first. It was actually going to — originally scheduled to start in three weeks on March 4. But former President Trump claimed presidential immunity. And he appealed this. The judge overseeing the D.C. case rejected that. A D.C. appeals court rejected that.

But that appeal is now before the Supreme Court of the United States. And so in that delay is how this case has now reinserted itself into the schedule.

In fact, today, Judge Merchan, who is overseeing the Stormy Daniels case, noted that he had been in touch with Judge Chutkan, who is overseeing the D.C. case, to talk about the scheduling. And so he argues that he can now get this hush money case in New York started and completed before the D.C. case would ever begin.

Now, some of the D.C. case is resting on what the Supreme Court does. If they pick it up, then the D.C. case could be delayed for months. We just don't really know.

As you played the clip from Trump at the beginning, Trump's lawyers all along were arguing today that it is fundamentally unfair to put Donald Trump on trial for this case right in the middle of the election. They said he should be out campaigning in states all over the country, not sitting in a courthouse.

But Judge Merchan said, no, justice is not going to wait, and the trial starts March 25.

William, I need to ask you about another case. That's the election interference case in Georgia.

So, the district attorney there, Fani Willis, who's overseeing that case, is now facing allegations of having an improper relationship with one of her lead attorneys. There was a rather contentious hearing on that today. What can you tell us about what happened?

Amna, I think contentious is the gentlest way to refer to that hearing today.

As you said, the Fulton County district attorney, Fani Willis, is facing these allegations that were brought up by one of the 19 defendants in her huge racketeering election interference case in Georgia. One of those defendants said, you were having an inappropriate relationship with the lead prosecutor that you selected to run this case, and that, with his salary, he is taking you, Fani Willis, on expensive vacations all over the world and all over the country, and that that's a clear conflict of interest, and you should be disqualified from the case.

So, today, the judge overseeing this, Judge McAfee, held a hearing to try to get to the bottom of this. And Willis and the lead prosecutor who she was having a relationship with, a man named Nathan Wade, they both admitted, as they had in previous filings, that they did have a relationship, a romantic relationship, but they both reasserted that relationship did not start until after Wade had been hired.

And so the idea that she was intentionally hiring a boyfriend to then reap the benefits of it, they rejected that argument. There was one witness, a former colleague of Fani Willis, who testified today that she believed the relationship had started many years before, before Wade was hired.

Fani Willis, in later testimony, said that was a former colleague who had been asked to resign because of poor performance, basically implying that she was a disgruntled former employee.

So I want to play just one clip from today. It was really incredible amount of back-and-forth, conflict with the lawyers, conflict with the judge, Fani Willis herself on the witness stand being — really pushing back on this. Let's play this one clip to get a taste of what this was like today.

Fani Willis (D), Fulton County, Georgia, District Attorney: You have been intrusive into people's personal lives. You're confused. You think I'm on trial. These people are on trial for trying to steal an election in 2020. I'm not on trial, no matter how hard you try to put me on trial.

So, more testimony will occur tomorrow. Judge McAfee will decide in the end whether or not Fani Willis has to be removed from this case.

All right, that is William Brangham joining us from New York tonight.

William, thank you so much.

You're welcome, Amna.

Listen to this Segment

NFL: Super Bowl LVIII-Kansas City Chiefs Celebration

Watch the Full Episode

William Brangham is a correspondent and producer for PBS NewsHour in Washington, D.C. He joined the flagship PBS program in 2015, after spending two years with PBS NewsHour Weekend in New York City.

Support Provided By: Learn more

More Ways to Watch

  • PBS iPhone App
  • PBS iPad App

Educate your inbox

Subscribe to Here’s the Deal, our politics newsletter for analysis you won’t find anywhere else.

Thank you. Please check your inbox to confirm.

BDO

IMAGES

  1. Delays in verilog

    system verilog assign delay

  2. Delay in Verilog

    system verilog assign delay

  3. Delays in verilog

    system verilog assign delay

  4. PPT

    system verilog assign delay

  5. Delays in verilog

    system verilog assign delay

  6. Delays in verilog

    system verilog assign delay

VIDEO

  1. system verilog 1.1

  2. System Verilog

  3. FIFO 18131A04G5

  4. INTERFACE IN SYSTEM VERILOG #1ksubscribers #vlsi #ALLABOUTVLSI #systemverilog

  5. Important :: multiple modules design verilog solved example part 3

  6. System verilog constraint interview question so 1, randomize 16 bit var, consecutive 2 bits 1 rest 0

COMMENTS

  1. system verilog

    1 Answer Sorted by: 0 rise/fall delays are not defined for anything other than integral values. Share Improve this answer Follow answered Aug 23, 2017 at 1:25 dave_59 40.4k 3 25 63 Thanks dave_59. Ya, I observed that. However, is there a way to realise the above?

  2. Verilog Inter and Intra Assignment Delay

    Verilog delay statements can have delays specified either on the left hand side or the right hand side of the assignment operator. Inter-assignment Delays // Delay is specified on the left side #<delay> <LHS> = <RHS> An inter-assignment delay statement has delay value on the LHS of the assignment operator.

  3. Verilog Delay Control

    There are two types of timing controls in Verilog - delay and event expressions. The delay control is just a way of adding a delay between the time the simulator encounters the statement and when it actually executes it.

  4. Continuous Assigns

    You can add delay to a continuous assign statement as follows: assign #10 a = b & c; In this case, the value of a changes 10 units of time after the expression b & c changes. Continuous assign statement implement inertial delay, meaning that continuous assign statements swallow glitches.

  5. Delay in Assignment (#) in Verilog

    There are two types of delay assignments in Verilog: Delayed assignment: #Δt variable = expression; // " expression" gets evaluated after the time delay Δt and assigned to the "variable" immediately Intra-assignment delay: variable = #Δt expression; // "expression" gets evaluated at time 0 but gets assigned to the "variable" after the time delay Δt

  6. Delay after and before assignment in SV

    Assign-Delay, SystemVerilog jaswanth_b August 9, 2021, 11:41am 1 Hi, What is the difference between below 2 codes? initial begin a=0; b=1; a = #3 1; c = #5 a + b; end initial begin a=0; b=1; #3 a = 1; #5 c = a + b; end What is the difference between delay after the '=' and before the variable name? Thanks. sabirshaikh August 9, 2021, 12:44pm 2

  7. Use variable for the delay in assign statement

    Use variable for the delay in assign statement - SystemVerilog - Verification Academy Use variable for the delay in assign statement SystemVerilog zz8318 July 6, 2020, 7:22pm 1 I have a piece of code like below. but it failed at syntax error. any help is appreciate.

  8. PDF Correct Methods For Adding Delays To Verilog Behavioral Models

    For most Verilog simulators, reject and error settings are specified as a percentage of propagation delay in multiples of 10%. Pure inertial delay example using reject/error switches. Add the Verilog command line options: +pulse_r/100 +pulse_e/100 reject all pulses less than 100% of propagation delay.

  9. SystemVerilog Assertions with time delay

    Until now in previous articles, simple boolean expressions were checked on every clock edge.But sequential checks take several clock cycles to complete and the time delay is specified by ## sign. ## Operator. If a is not high on any given clock cycle, the sequence starts and fails on the same cycle. However, if a is high on any clock, the assertion starts and succeeds if b is high 2 clocks later.

  10. system verilog

    2 Answers Sorted by: 9 assign #1400ps w_clk_d = clk; acts as a delay and filter. When clk changes wait 1400ps then then apply the current value (not original value) to w_clk_d. If the input changes faster than the delay intimidated values are lost. A similar behavior can also be observed with delay cells in physical circuits.

  11. Delay in Verilog

    Delay in Verilog Timing Control and delays in Verilog We have earlier seen how we have used delays when creating a testbench. A delay is specified by a # followed by the delay amount. The exact duration of the delay depends upon timescale. For example, if with `timescale 2ns/100ps, a delay with statement #50 ; will mean a delay of 100 ns.

  12. Assign delay behavioural differences

    reg. And since you are using SystemVerilog, I recommend replacing. I see no differences in behavior between the assignments to the wire versus the reg. I do a difference between the assignments with no delay versus the assignments with a delay of #1. The assignments with a delay will be 'x' for 1 time unit.

  13. Assignment delay's and Verilog's wait statement

    Avoid consuming time within them-such as with a wait statement of any type. Let the time be driven elsewhere by external events. This applies to both delays and wait conditions within always blocks, as well as any tasks that might be called from within them. Non-blocking assignment delays work well for this purpose.

  14. SystemVerilog Variable delay in SVA

    Below is one of the ways to implement the variable delay. Instead of ##v_delay, sequence ' delay_seq ' is used for variable delay. delay_seq works like while loop, variable value will be decremented on each clk cycle and checks for the value of 'delay' equals to '0'. The sequence will get ended once the value of ' delay ' equals ...

  15. Verilog assign statement

    Example #1 In the following example, a net called out is driven continuously by an expression of signals. i1 and i2 with the logical AND & form the expression. If the wires are instead converted into ports and synthesized, we will get an RTL schematic like the one shown below after synthesis.

  16. Signal delay by X clock cycles in System Verilog

    This works perfect, but somehow I just had to use: fs_shift_model_o <= repeat ( 4) @ (posedge clk) fs_model_o; to give me the expected result! This is way more comfortable than making several copies for a delay! Many thank and have a nice day :) FaisalAwan December 8, 2022, 6:04pm 4.

  17. Takeaways from Trump case hearings in New York and Georgia

    Delay, delay, delay. As they have with all of his cases, Trump's lawyers vigorously argued to delay the proceedings, citing the political calendar and Trump's other cases, including one in ...

  18. Can I add Delay in System Verilog function?

    function int f (bit a); #1; // ILLEGAL!!!! return !a; endfunction Function 'f' has illegal use of delay or synchronization The uses can be wait, delay, clocking block assign, fork-join and other task calls with delays For info on SystemVerilog (spelled as ONE word), go to http://standards.ieee.org/getieee/1800/download/1800-2012.pdf Ben Cohen

  19. Using wire and assign vs. wire in Verilog

    1 Answer Sorted by: 4 They are functionally the same in your example. There are slight differences when adding a delay to a wire declaration. wire #5 A = B & C; wire A; assign #5 A = B & C; In the first form, the delay gets added to all other net drivers. You can also use SDF back annotation to modify the wire delay.

  20. Verilog Gate Delay

    Verilog Gate Delay. Digital elements are binary entities and can only hold either of the two values - 0 and 1. However the transition from 0 to 1 and 1 to 0 have a transitional delay and so does each gate element to propagate the value from input to its output. For example, a two input AND gate has to switch the output to 1 if both inputs ...

  21. N.Y. judge denies Trump request to delay hush money trial

    The judge rejected Trump's motion to dismiss or delay the case and told lawyers to prepare for trial starting March 25. The former president attended the hearing today and again criticized the ...

  22. Assign random delay to existing clock

    The above code is for clock generator. but in my case there is already one clock and I want to delay/shift it by random delay. My random delay should be 0 to 1.28ns. It should be added at the beginning of the clock. (In other words I just want to shift phase). for example: lets say first positive edge comes at 1ns without adding any delay.

  23. #delay is not working as expected in system verilog class (timescale

    Timescale, SystemVerilog KranthiDV January 6, 2019, 7:45am 1 I add #2000ns in my class (actually it's a UVM test sequence), but it seems that it does not delay 2000ns, I print time before and after this delay, and find that the actual delay is 200ns. And I add a $printtimescale task in this class, then in my log it print: