系统verilog始终在始终内
我想知道这种语法是否被允许系统verilog始终在始终内,verilog,system-verilog,Verilog,System Verilog,我想知道这种语法是否被允许 always_comb begin case (aaa) 3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ : 3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ 3'b010: always #(1250ps + CLKREF_HALF_PERIO
always_comb begin
case (aaa)
3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ :
3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ
3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ
3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ
3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ
default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ
endcase
我得到了关于嵌套始终在案例中的编译错误。
我试图让时钟频率根据aaa的输入而改变。
然而,问题更多的是关于“始终在始终块中的始终是否合法”的问题。不允许嵌套的程序块。我相信,
aaaaa
是这里的一个参数。如果是这样,您可以使用生成块。使用不同的时钟频率。这将使单个组合块一次处于活动状态。示例代码可以如下所示:
generate
case (aaaaaa)
3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ :
3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ
3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ
3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ
3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ
default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ
endgenerate
如果aaa
是变量/寄存器/连线,则可以使用永久
循环构造,而不是内部始终
块。Dave_59的回答中更清楚地显示了示例用法
有关生成程序块的更多信息,请参阅第27.5节。不允许嵌套程序块。我相信,aaaaa
是这里的一个参数。如果是这样,您可以使用生成块。使用不同的时钟频率。这将使单个组合块一次处于活动状态。示例代码可以如下所示:
generate
case (aaaaaa)
3'b000: always #(CLKREF_HALF_PERIOD + 5000ps) xclk=~xclk ;//000 at 80MHZ :
3'b001: always #(3750ps + CLKREF_HALF_PERIOD) xclk=~xclk;//001 at 100MHZ
3'b010: always #(1250ps + CLKREF_HALF_PERIOD) xclk=~xclk;//010 at 200MHZ
3'b011: always #(0.252ns + CLKREF_HALF_PERIOD) xclk=~xclk;//011 at 333MHZ
3'b100: always #(0.112ns + CLKREF_HALF_PERIOD) xclk=~xclk;//100 at 367MHZ
default always #(CLKREF_HALF_PERIOD/1) xclk=~xclk;//default at 400MHZ
endgenerate
如果aaa
是变量/寄存器/连线,则可以使用永久
循环构造,而不是内部始终
块。Dave_59的回答中更清楚地显示了示例用法
有关生成块的更多信息,请参阅第27.5节。永久循环解决方案不起作用,因为顶级始终块无法退出永久循环并转到case语句的另一个分支。一个更简单的解决方案是使用一个always块来计算时钟延迟,另一个always块来创建时钟
int clk_delay;
always_comb
case (aaa)
3'b000: clk_delay = CLKREF_HALF_PERIOD + 5000ps; //000 at 80MHZ
3'b001: clk_delay = 3750ps + CLKREF_HALF_PERIOD; //001 at 100MHZ
...
always #clk_delay xclk = ! xclk;
永久循环解决方案不起作用,因为顶级始终
块无法退出永久
循环并转到case语句的另一个分支。一个更简单的解决方案是使用一个always块来计算时钟延迟,另一个always块来创建时钟
int clk_delay;
always_comb
case (aaa)
3'b000: clk_delay = CLKREF_HALF_PERIOD + 5000ps; //000 at 80MHZ
3'b001: clk_delay = 3750ps + CLKREF_HALF_PERIOD; //001 at 100MHZ
...
always #clk_delay xclk = ! xclk;
请添加和解释您正在尝试执行的操作。请添加和解释您正在尝试执行的操作。aaa在此测试台中被视为“逻辑”,因此它是一个可以在运行时更改其值的变量(而不是elab时间常数)。因此,您应该使用第二个选项永久
循环。顺便说一句,您不能将始终_comb
与具有延迟或不代表组合逻辑的代码一起使用哦!我差点忘了。谢谢你的指点。我只是想强调一点,它可以使用永远循环来完成。aaa在这个测试台中被视为一个“逻辑”,所以它是一个可以在运行时更改其值的变量(而不是elab时间常数)。因此,您应该使用第二个选项永久
循环。顺便说一句,您不能将始终_comb
与具有延迟或不代表组合逻辑的代码一起使用哦!我差点忘了。谢谢你的指点。我只是想强调一点,它可以使用永久
循环来完成。