SystemVerilog入门:always_comb逻辑分析

需积分: 49 20 下载量 54 浏览量 更新于2024-07-11 收藏 1002KB PPT 举报
"always_comb特定逻辑过程-systemVerilog入门PPT" SystemVerilog是一种强大的硬件描述语言,它在Verilog的基础上进行了许多革命性的扩展。SystemVerilog的基本知识包括了多种新特性,如断言、邮箱、测试程序块、信号量、时钟域、约束随机值以及过程控制等。在SystemVerilog讲座中,这些概念被逐步引入,帮助学习者理解这个语言的强大之处。 在SystemVerilog中,`always_comb`关键字用于定义组合逻辑过程。它是一个非常重要的概念,因为正确使用`always_comb`能够确保你的代码按照预期的方式执行组合逻辑操作。组合逻辑是指输入改变时,输出立即更新的逻辑电路。`always_comb`块内的代码会在每次输入变化时执行,其结果直接影响到输出。 在示例代码中,可以看到两个使用`always_comb`的例子。第一个例子展示了如何正确地使用`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`块包含了三个逻辑操作:`tmp1`和`tmp2`分别存储了输入`a`和`b`的与结果,以及输入`c`和`d`的与结果。最后,`y`的值由`tmp1`和`tmp2`的或结果决定。由于`always_comb`的存在,当输入`a`、`b`、`c`或`d`发生变化时,`y`的值会立即更新。 第二个例子展示了错误使用`always_comb`可能导致的问题: ```systemverilog module ao1( output bit_t y, input bit_t en, d ); always_comb if (en) y <= 0 ; endmodule ``` 在这个模块中,当`en`为高时,`y`将被赋值为0。然而,由于`always_comb`通常用于组合逻辑,这里的赋值操作实际上创建了一个隐含的锁存器,这并不是我们想要的组合逻辑。在组合逻辑中,不应该有状态保持元素,因此这样的代码可能会导致错误。如果编译器或仿真器检测到这样的代码,可能会给出关于锁存器产生的错误信息。 了解并正确使用`always_comb`对于编写高效、无错误的SystemVerilog代码至关重要。它可以帮助你避免不必要的时序问题,同时保持设计的清晰和可读性。在设计验证和综合阶段,正确使用`always_comb`可以避免产生意外的存储元件,从而确保逻辑行为的正确性。因此,深入理解和熟练运用`always_comb`是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 上传