Verilog的综合指令

Synopsys综合指令

综合指令(Synthesis directives)是一些特殊的注释,一般以//synopsys、/*synopsys、//$s或//$S开始,能够影响综合工具的行为,但是在其他工具看来这就是普通的注释。

常见的综合指令有:

  • async_set_reset
  • async_set_reset_local
  • async_set_reset_local_all
  • dc_tcl_script_begin and dc_tcl_script_end
  • enum
  • full_case
  • infer_multibit and dont_infer_multibit
  • infer_mux
  • infer_onehot_mux
  • keep_signal_name
  • one_cold
  • one_hot
  • parallel_case
  • preserve_sequential
  • sync_set_reset
  • sync_set_reset_local
  • sync_set_reset_local_all
  • template
  • translate_off and translate_on

full_case和parallel_case

结论:不要用!!!

有一句神话说:这两条指令会使设计变得更小更快,而且不会生成latch。事实上,这两条指令可能会对设计毫无影响、没有什么作用;甚至把设计变得更大更慢,还是会有latch生成出来。而且这两条指令可能会把设计的功能改变,导致前后仿结果不一致,所以这两条指令其实是危险的,最好是在Verilog中避免使用到。

full_case

设置了full_case语句代表的是case语句中即使没有default也认为现在的case目前的所有情况已经完整,不会有其他情况出现。下面看三个使用full_case的例子

module mux3d(y,a,b,c,sel);
input [1:0] sel;
input a,b,c;
output reg y;
always@(a or b or c or sel) begin
	//y = 1'b0;
	case(sel) //synposys full_case
	2'b00 : y=a;
	2'b01 : y=b;
	2'b10 : y=c;
	2'b11 : y=1'b0;
	endcase
end
endmodule

上面这一份代码中sel的可选情况已经满了,确定过case情况完整且不需要default的情况下可以设置full_case,这时的full_case对设计的唯一好处就是不用写default。

module mux3d(y,a,b,c,sel);
input [1:0] sel;
input a,b,c;
output reg y;
always@(a or b or c or sel) begin
	//y = 1'b0;
	case(sel) //synposys full_case
	2'b00 : y=a;
	2'b01 : y=b;
	2'b10 : y=c;
	//2'b11 : y=1'b0;
	endcase
end
endmodule

对于上面这一份代码,case不是完整的,但是case语句头上加了一条"full_case"指令,综合工具会认为是完整的。仿真时,sel=2’b11时,y输出表现为一个latch;但是综合工具把sel=2’b11时y输出当做“不关心”,从而导致前后仿不一致。

module mux3d(y,a,b,c,sel);
input [1:0] sel;
input a,b,c;
output reg y;
always@(a or b or c or sel) begin
	y = 1'b0;
	case(sel) //synposys full_case
	2'b00 : y=a;
	2'b01 : y=b;
	2'b10 : y=c;
	//2'b11 : y=1'b0;
	endcase
end
endmodule

对于上面这一份代码,case是完整的,即使没有sel=2’b11它也是完整的,在sel=2’b11时,y=1’b0,如果在没有加full_case指令时前后仿是一致的。但是如果加了,那么同理在sel=2’b11时综合工具认为y输出当做“不关心”,但是实际结果应该是0。

!!!好消息!!!
如果你一定要用,而full_case指令又恰好被用于不是完整的case语句上,dc_shell会报以下warning,能不能被你看到就是天意了。

Warning:You are using the full_case directive with a casestatement in which not all cases are covered.

parallel_case

parallel_case语句指的是case条件只能匹配一个case项目的语句。如果发现case条件能够匹配超过1个的case项目的话,那么这个case语句就不是parallel_case。和full_case同样不推荐使用,否则会使得前后仿是不一致的。

async_set_reset 和sync_set_reset

这两个指令可以帮助综合工具知道reset的类型,这两个指令在特定情况下必须使用,下面给两个例子。

//synopsys async_set_reset "reset_n"
always@(clock or reset_n)
	if(!reset_n) L_en <= en;
	else if(!clock) L_en <= en;

对于上述代码的Latch,如果不使用async_set_reset,综合工具不知道reset_n是异步复位,那么会生成一个没有异步复位的Latch;如果使用aync_set_reset,综合工具就知道reset_n是异步复位,那么就会生成一个有异步复位的Latch。

//synopsys sync_set_reset "reset_n"
always@(posedge clock)
	if(!reset_n)	R_en <= en;
	else if(flag)	R_en <= en;

对于上述代码,为了能够综合出带有同步复位的触发器,必须告诉综合工具reset_n是同步复位,让它不和其他组合逻辑混杂在一起,所以使用sync_set_reset 。

translate_off/on

这两条指令用得最多的就是在设计中使用一些函数。

module mux3d(y,a,b,c,sel);
input [1:0] sel;
input a,b,c;
output reg y;
always@(a or b or c or sel) begin
	case(sel) 
	2'b00 : y=a;
	2'b01 : y=b;
	2'b10 : y=c;
	2'b11 : y=1'b0;
	default : y = 1'b0;
	endcase
end
// synopsys translate_off
always(*) begin
	if(sel)
		$display("y=%d",y);
end	
// synopsys translate_on
endmodule

上述的$display函数是不可综合的,因此由translate_off和translate_on包起来告知综合工具这一段不需要care。
注意:现在Sysnopsys不推荐使用translate_off和translate_on,Sysnopsys推荐使用dc_shell预定义的宏定义SYNTHESIS,例如上述代码可以改为如下:

module mux3d(y,a,b,c,sel);
input [1:0] sel;
input a,b,c;
output reg y;
always@(a or b or c or sel) begin
	case(sel) 
	2'b00 : y=a;
	2'b01 : y=b;
	2'b10 : y=c;
	2'b11 : y=1'b0;
	default : y = 1'b0;
	endcase
end
`ifndef SYNTHESIS
always(*) begin
	if(sel)
		$display("y=%d",y);
end	
`endif
endmodule
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟花一时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值