diff options
Diffstat (limited to 'tmp/review_nonblocking_verilog_kill')
-rw-r--r-- | tmp/review_nonblocking_verilog_kill | 67 |
1 files changed, 0 insertions, 67 deletions
diff --git a/tmp/review_nonblocking_verilog_kill b/tmp/review_nonblocking_verilog_kill deleted file mode 100644 index 296f8c5..0000000 --- a/tmp/review_nonblocking_verilog_kill +++ /dev/null @@ -1,67 +0,0 @@ -to: team@leaflabs.com -subj: paper review: "Nonblocking Assignments in Verilog Synthesis..." - -TL;DR: this is something like a "goto considered harmful" w/r/t using confusing -blocking assignment in (non-sythesizable?) Verilog. - -# Context - -This paper was written in 2000 and seems to target Verilog programmers who -write non-synthesizable simulation code. Despite the word "Synthesis" in the -title. After reading, the implication that this paper might have any new -insights for an engineer whose failure might "kill" stikes fear in my gut. - -Apparently this won a "Best Paper" award at a conference back when it was -published. - -On page 15 there is a note about about synthesis performance: "The latter would -be inefficient from a simulation time perspective"; perhaps this was the -historical temptation of these bad practices? - -# Judgement - -There's really nothing new here (for jess/aj/bryan at least): for sequential -logic use nonblocking assignment in always@ blocks, and for combinatoral logic -use 'assign' statements outside of a block, unless you have something really -tight and complicated going on, in which case use an always block with a -carefully selected sensitivity list and all blocking assignments inside. - -# Nuggets - -From page 20: "Nonblocking assignments are updated after all $display -commands". I did not know this! The example given is pretty good; $strobe is -recommended as the alternative: - - module display_cmds; - reg a; - initial $monitor("\$monitor: a = %b", a); - initial begin - $strobe ("\$strobe : a = %b", a); - a = 0; - a <= 1; - $display ("\$display: a = %b", a); - #1 $finish; - end - endmodule - -gives: - - $display: a = 0 - $monitor: a = 1 - $strobe : a = 1 - -# Appendix: Verilog Coding Guidelines - -Verbatim from paper: - -1: When modeling sequential logic, use nonblocking assignments. -2: When modeling latches, use nonblocking assignments. -3: When modeling combinational logic with an always block, use blocking -. -4: When modeling both sequential and combinational logic within the same always -nonblocking assignments. -5: Do not mix blocking and nonblocking assignments in the same always block. -6: Do not make assignments to the same variable from more than one always block. -7: Use $strobe to display values that have been assigned using nonblocking -. -8: Do not make assignments using #0 delays. |