SystemVerilog讲座:深入理解always_comb逻辑

需积分: 0 0 下载量 141 浏览量 更新于2024-07-14 收藏 1002KB PPT 举报
"SystemVerilog讲座内容涉及到`always_comb`关键字在编写组合逻辑时的使用,以及SystemVerilog的发展历史和重要性。" SystemVerilog是Verilog的扩展,提供了更多的高级特性,使得硬件描述语言的功能更加丰富和强大。在SystemVerilog中,`always_comb`关键字用于定义组合逻辑过程,它确保了代码块内部的计算会在输入改变时立即更新输出,且无副作用。`always_comb` block 是一种基于事件驱动的机制,每当其所有输入变量发生变化时,该块中的代码就会被执行。 在提供的代码示例中,正确使用`always_comb`的例子如下: ```systemverilog module ao1( output bit_t y, input bit_t a, b, c, d ); bit_t tmp1, tmp2; always_comb begin tmp1 = a & b; tmp2 = c & d; y = tmp1 | tmp2; end endmodule ``` 在这个例子中,`always_comb` block 用来描述组合逻辑电路,当输入a、b、c或d有任何变化时,tmp1和tmp2的值将更新,并且y的值也会随之更新。这样的代码结构可以有效地避免意外的寄生锁存器的生成。 然而,错误的使用`always_comb`可能会导致意外的锁存器(latch)生成。例如: ```systemverilog module ao1( output bit_t y, input bit_t en, d ); always_comb if (en) y <= 0 ; endmodule ``` 在这个错误的示例中,如果en信号是高电平,y将会被置为0并保持这个状态,即使en变为低电平,y的值也不会改变,除非有其他信号强制y改变。这实际上创建了一个隐含的锁存器,而不是组合逻辑,这在大多数情况下不是设计者所期望的。 SystemVerilog的发展历程展示了其逐渐成为业界标准的过程,从最早的Verilog版本到后来的SystemVerilog扩展,增加了诸如断言(assertions)、邮箱(mailboxes)、测试程序块(testbench blocks)、信号量(semaphores)、时钟域(clocking domains)、约束随机化(constrained random values)、进程控制(process control)以及直接调用C函数等高级功能,极大地提高了验证效率和设计质量。 正确理解和使用`always_comb`对于编写高质量的SystemVerilog代码至关重要,它可以确保组合逻辑的正确实现,避免意外的存储元素生成,提高设计的可读性和可维护性。同时,理解SystemVerilog的扩展特性能够帮助开发者更好地利用这一强大的硬件描述语言进行复杂的设计和验证工作。

以hive的角度检查语法: with cur_dim_comb as (SELECT DISTINCT t.dim_comb ,t.var_sub_class ,t.acc_value FROM gerp.cux_cst_data_alloc_his t WHERE t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id )) select tp.bd_code --事业部编码 ,tp.bd_name --事业部名称 ,hp.ou_code --OU名称 ,hp.ou_name --OU编码 ,op.main_class_desc --差异大类 ,op.acc_value --科目代码 ,op.acc_desc --科目名称 ,op.dim_comb --区分维度 ,op.begin_amount --期初余额 ,op.accrual_amount --本期发生 ,op.balance_diff_alloc_amount --期末差异结存 ,op.var_sub_class ,op.main_class_value ,op.org_id ,op.period_name ,op.job_ver_id from (select up.* ,q1.* from (SELECT DISTINCT maincl.* ,t.* FROM t inner join (SELECT fv.flex_value ,fv.description FROM fv inner join fs on fv.flex_value_set_id = fs.flex_value_set_id AND fs.flex_value_set_name = 'CUX_CST_VARIANCE_TYPE' AND fv.enabled_flag = 'Y' AND fv.hierarchy_level = '2' AND fv.flex_value LIKE '10%' ) maincl on t.var_main_class = maincl.flex_value inner join cur_dim_comb on cur_dim_comb.var_sub_class = t.var_sub_class and cur_dim_comb.acc_value = t.acc_value WHERE 1 = 1 AND t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id) ORDER BY maincl.description ,t.acc_value ,cur_dim_comb.dim_comb ) up inner join (SELECT t1.* ,SUM(t1.begin_amount) begin_amount ,SUM(t1.accrual_amount) accrual_amount ,SUM(t1.balance_diff_alloc_amount) balance_diff_alloc_amount FROM gerp.cux_cst_data_alloc_his t1 LEFT JOIN gerp.cux_cst_data_alloc_his t ON t1.top_var_type = '10' AND t1.var_sub_class = t.var_sub_class --p_var_sub_class AND t1.org_id = t.org_id --p_org_id AND t1.period_name = t.period_name --p_period_name AND t1.job_ver_id = t.job_ver_id --p_job_ver_id AND t1.acc_value = t.acc_value --p_acc_value WHERE t1.dim_comb in (select distinct dim_comb from cur_dim_comb) group by t1.org_id,t1.period_name,t1.job_ver_id,t1.var_sub_class,t1.acc_value ) q1 on q1.org_id = up.org_id --p_org_id AND q1.period_name = up.period_name --p_period_name AND q1.job_ver_id = up.job_ver_id --p_job_ver_id AND q1.var_sub_class = up.var_sub_class --p_var_sub_class AND q1.acc_value = up.acc_value --p_acc_value ) op

2023-05-26 上传